You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python调用类内方法报错NameError: 'UpVel' is not defined如何解决

错误原因及修复方案

核心错误点

  • 类内实例方法调用规则错误:UpVel是Object类内部定义的实例方法,必须通过self(当前实例)引用调用,直接写UpVel()会被解释器识别为全局函数,全局作用域没有定义该函数就会抛出NameError
  • 实例方法定义不规范:Python类的实例方法第一个参数必须为self,代表当前实例对象,原UpVel方法没有该参数,无法访问/修改实例本身的速度、位置属性
  • 变量名错误:UpVel方法内使用了未定义的变量t,实际应为参数time
  • 属性修改逻辑错误:原UpVel方法修改的是局部变量vel,不会同步更新实例本身的vel属性,后续计算位移时会一直用初始值0
  • 参数逻辑冲突:原Move方法传入了vel参数,但计算位移时用的是实例属性self.vel,和传参逻辑不符

修复后代码

class Object:
    def __init__(self, mass, srtpos=0, vel=0):
        self.mass = mass
        self.srtpos = srtpos
        self.vel = vel
    
    def UpVel(self, time=1, a=0):
        # 直接修改实例自身的vel属性
        self.vel = self.vel + a * time
    
    def Move(self, time=1, a=0):
        self.srtpos += self.vel * time + 0.5 * a * (time ** 2)
        # 通过self调用类内方法
        self.UpVel(time, a)

a = Object(5, vel=5)
print(a.srtpos)
for i in range(5):
    # 加速度为0时速度保持5,每次移动1秒位移为5
    a.Move()
    print(a.srtpos)

运行结果

0
5
10
15
20
25

如果需要模拟带加速度的运动,调用Move方法时传入a参数即可,例如a.Move(a=2)。

内容的提问来源于stack exchange,提问作者Atharva Bedekar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 07:15:02