子类继承父类的本质是通过括号声明关系、正确调用父类__init__初始化实例属性、并依MRO动态查找方法;不调用super().__init__()则无父类属性,不重写则自动沿MRO使用父类方法。

子类继承父类的属性和方法,本质是通过类定义时的括号语法 + 正确初始化 + 方法查找机制共同实现的。关键不在“自动复制”,而在于实例化时如何触发父类的初始化逻辑,以及运行时如何按规则找到对应属性或方法。
继承的前提:正确声明父类关系
在定义子类时,把父类名写在括号里即可建立继承关系:
class Child(Parent): # 单继承
class Child(Parent1, Parent2): # 多重继承
这样写后,Child 类就拥有了访问 Parent 所有非私有属性和方法的能力——但前提是这些属性已在实例对象上存在。
属性继承的核心:靠 __init__ 初始化,不是靠“抄代码”
父类的属性(如 self.name)是在其 __init__ 方法中赋值到实例上的。子类若想让这些属性出现在自己的实例中,必须主动调用父类的 __init__:
- 推荐写法:
super().__init__(...)—— 简洁、支持多重继承、适应 MRO - 兼容写法:
Parent.__init__(self, ...)—— 明确指定父类,适合简单单继承 - 不调用父类
__init__,又没在子类中重新赋值同名属性 → 实例就没有该属性,访问会报AttributeError
方法继承的原理:动态查找,不是静态复制
Python 在调用方法时,会按「方法解析顺序(MRO)」从子类开始向上搜索:
- 先查子类有没有这个方法名;有,就执行子类版本
- 没有,再按 MRO 查父类;直到找到第一个匹配的版本
- 所以即使子类没写任何方法,只要父类有,就能直接用
例如:child_instance.get_name() 能运行,是因为 Python 沿着 MRO 找到了父类中的 get_name 方法。
重写与调用父类版本:用 super() 或类名显式调用
当子类定义了同名方法或属性,就叫“重写”。此时默认用子类版本,但需要父类逻辑时:
- 调用父类方法:
super().method_name()或Parent.method_name(self) - 访问父类属性(未被子类覆盖时):
super().attr或Parent.attr(仅限类属性) - 注意:私有属性/方法(双下划线开头)会被名称改写,需用
_Parent__attr形式访问,一般不建议

















