Python子类继承父类属性异常问题求助
Python子类继承父类属性时灵时不灵?问题出在这!
嘿,我来帮你捋捋这个问题!从你贴的代码片段来看,最可能的导火索是重复定义了Animals类——这在Python里会直接覆盖之前的类定义,导致继承链混乱,出现“有时能继承有时不能”的诡异情况。
先看你代码里的核心问题
你写代码的顺序是这样的:
>>> class Things: pass >>> class Inanimate(Things): pass >>> class Animate(Things): pass >>> class Animals(Animate): pass # 第一个空的Animals类 >>> class Mammals(Animals): pass >>> class Giraffes(Mammals): pass >>> class Animals(Animate): def breathe... # 重新定义了Animals类
这里的问题在于:
- 当你第一次定义
Animals(Animate): pass时,Python创建了一个空的Animals类,紧接着的Mammals和Giraffes都是继承自这个旧的空类。 - 之后你重新定义
Animals类时,Python会把原来的Animals替换成新的版本,但已经定义好的Mammals、Giraffes并不会自动更新它们的继承关系——它们依然绑定到最初那个空的Animals。 - 结果就是:你实例化新的
Animals时能看到breathe方法,但实例化Giraffes时,它的父类链里还是旧的空Animals,自然找不到这个方法,看起来就像“继承失败”了。
还有这些常见坑也会导致类似问题
除了重复定义类,这两个场景也经常让人误以为继承出问题:
- 子类没调用父类的初始化方法:如果父类通过
__init__定义了实例属性,子类自己写了__init__但没调用super().__init__(),父类的属性就不会被初始化。比如:class Parent: def __init__(self): self.parent_attr = "我是父类属性" class Child(Parent): def __init__(self): # 没调用super(),父类属性不会被初始化 self.child_attr = "我是子类属性" c = Child() print(c.parent_attr) # 会抛出AttributeError! - 子类意外重写了父类成员:如果子类定义了和父类同名的属性或方法,会直接覆盖父类的版本。比如父类有个
name属性,子类也定义了name,那子类实例访问的就是自己的name,看起来像是没继承到父类的。
怎么解决?
- 针对你当前的代码:删掉重复的
Animals类定义,确保先写完整的Animals类,再定义它的子类Mammals、Giraffes,让继承链保持连贯。 - 养成初始化好习惯:只要子类写了
__init__,一定要记得调用super().__init__()(或者直接Parent.__init__(self)),保证父类的属性被正确初始化。 - 检查重写情况:如果子类有和父类同名的成员,确认是不是故意要覆盖,避免不小心覆盖导致的“继承失效”错觉。
内容的提问来源于stack exchange,提问作者Macas
相关产品推荐
相关产品推荐

