Python跨类调用方法触发AttributeError问题求助
Python跨类调用方法问题解决
问题原因分析
你遇到的两个错误本质都是对Python类方法调用逻辑理解有误:
- 第一个错误:你试图用
mainTest实例(self)调用mainTest2的方法,self属于mainTest,自然没有dosomethingelse方法。 - 第二个错误:直接调用
mainTest2.dosomethingelse(self)时,把mainTest实例传给了mainTest2方法的self参数,但该方法里用到的self.d是mainTest2实例才有的属性,mainTest实例没有,所以报错。
正确调用方式
根据dosomethingelse的方法类型,有三种正确的调用方式:
1. 调用实例方法(最常见场景)
如果dosomethingelse是mainTest2的实例方法(依赖mainTest2实例的属性,比如self.d),必须先创建mainTest2的实例,再调用方法:
class mainTest: def runsomething(self): # 创建mainTest2的实例 mt2_instance = mainTest2() # 调用实例方法 mt2_instance.dosomethingelse() class mainTest2: def __init__(self): self.d = "some value" # 实例属性d def dosomethingelse(self): print(self.d)
2. 调用类方法
如果dosomethingelse不需要依赖mainTest2的实例属性,只和类相关,用@classmethod装饰:
class mainTest: def runsomething(self): # 直接通过类调用类方法 mainTest2.dosomethingelse() class mainTest2: @classmethod def dosomethingelse(cls): print("这是类方法,不需要实例")
3. 调用静态方法
如果dosomethingelse既不依赖实例也不依赖类,用@staticmethod装饰:
class mainTest: def runsomething(self): # 直接通过类调用静态方法 mainTest2.dosomethingelse() class mainTest2: @staticmethod def dosomethingelse(): print("这是静态方法,无self/cls参数")
内容的提问来源于stack exchange,提问作者Captain C
相关产品推荐
相关产品推荐

