Python类内函数调用出现NameError及相关报错问题求助
Python类方法调用错误排查与修复
问题根源分析
原代码中
function1和function2作为类class1的方法,未遵循Python类方法的调用规则:- 在类方法内部调用其他方法时,必须通过类名或实例对象引用,直接写方法名会触发
NameError。 - 默认定义的是实例方法,第一个参数必须是
self,且需先创建类实例再调用;若想直接通过类名调用,需使用@staticmethod或@classmethod装饰器。
- 在类方法内部调用其他方法时,必须通过类名或实例对象引用,直接写方法名会触发
你添加
self后出现的错误原因:AttributeError: type object 'class1' has no attribute 'num1':错误使用class1.num1.function2(num2)语法,num1是全局变量而非类属性,无法通过类名直接访问。TypeError: class1.function2() missing 1 required positional argument: 'num2':添加self后方法变为实例方法,直接用类名调用时,Python会把类本身作为self传入,你传入的num1和num2会被当作后续参数,导致参数数量不匹配。
修复方案
方案1:使用实例方法(符合面向对象设计)
给每个实例方法添加self参数,创建类实例后调用方法:
num2 = 1234 num1 = 123 class class1(): def function1(self, num1, num2): t = num1 + num2 return t def function2(self, num1, num2): # 通过self调用同一类中的其他实例方法 print(self.function1(num1, num2)) # 创建类的实例 obj = class1() # 通过实例调用方法 obj.function2(num1, num2)
方案2:使用静态方法(适合无状态工具类方法)
如果方法不需要访问类/实例属性,用@staticmethod装饰器,可直接通过类名调用:
num2 = 1234 num1 = 123 class class1(): @staticmethod def function1(num1, num2): t = num1 + num2 return t @staticmethod def function2(num1, num2): # 通过类名调用静态方法 print(class1.function1(num1, num2)) # 直接通过类名调用静态方法 class1.function2(num1, num2)
内容的提问来源于stack exchange,提问作者Mechtaatel
相关产品推荐
相关产品推荐

