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
相关产品推荐
相关产品推荐

