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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:15:07