Python子类无法访问父类方法:AttributeError报错原因咨询
问题分析与解决
你的问题核心是缩进错误——你把Dog类的__init__方法定义在了类的外面,变成了一个全局函数,而不是Dog类的成员方法。
先看你代码里的关键问题点:
class Dog(Animal): pass # 这里的__init__是全局函数,不属于Dog类! def __init__(self, name, isBig): Animal.__init__(self, name, "Dog") self.isBig = isBig
为什么会出现AttributeError?
严格来说,如果__init__是全局函数,Dog类会完整继承Animal的所有方法(包括getName()),理论上调用dog.getName()不该报错。但你实例化Dog("Bob", True)时,实际调用的是父类Animal的构造方法,它会把第二个参数True赋值给self.species(这显然不符合你想把物种设为"Dog"的预期)。
不过更可能的是,你编写代码时的缩进混乱导致了隐性问题(比如在交互环境中类定义没有正确闭合),或者误操作让Dog类的继承关系失效,最终导致父类方法无法被访问。
修复后的代码
把__init__方法正确缩进,放到Dog类内部,这样它才是Dog类的构造方法:
class Animal: def __init__(self, name, species): self.name = name self.species = species def getName(self): return self.name def getSpecies(self): return self.species def __del__(self): print ("This came from del method") class Dog(Animal): def __init__(self, name, isBig): # 调用父类构造方法初始化name和species Animal.__init__(self, name, "Dog") self.isBig = isBig
现在实例化并调用方法:
dog = Dog("Bob", True) print(dog.getName()) # 输出 "Bob"
优化建议
在Python中,推荐使用super()来调用父类的构造方法,这样代码更灵活,尤其是在多继承场景下:
class Dog(Animal): def __init__(self, name, isBig): # Python 3 写法 super().__init__(name, "Dog") # 如果是Python 2,使用这个写法:super(Dog, self).__init__(name, "Dog") self.isBig = isBig
内容的提问来源于stack exchange,提问作者swam
相关产品推荐
相关产品推荐

