← Backend / Python / 基础专题

16_继承组合与特殊方法

理解继承、方法覆盖、`super()` 和常见特殊方法。

Python 基础专题 16:继承、组合与特殊方法

学习目标:理解继承、方法覆盖、super() 和常见特殊方法。

核心知识

继承让子类复用父类行为,并可覆盖方法。若子类自定义 __init__ 且仍需要父类初始化,要调用 super().__init__(...)。继承表达“是一种”关系;若只是“拥有一个”对象,组合通常更清楚。多重继承会涉及方法解析顺序(MRO),初学阶段先掌握单继承。

class Animal:
    def speak(self) -> str:
        return "声音"

class Cat(Animal):
    def speak(self) -> str:
        return "喵"

def announce(animal: Animal) -> str:
    return animal.speak()

assert announce(Cat()) == "喵"

isinstance(cat, Animal) 检查类型关系。__repr__ 提供面向开发者的对象表示,__str__ 提供可读文本;__len__ 让对象能被 len() 调用,__eq__ 自定义相等比较。特殊方法应保持符合直觉的语义。@dataclass 可为数据对象生成初始化与表示等方法,但可变字段应使用 field(default_factory=list)。

Python 的双下划线前缀属性会做名称改写,主要用于避免子类命名冲突,不是严格的安全隔离。单下划线前缀表示“内部使用”的约定。

逐步理解

阅读多态示例时关注 announce 并不知道传入的是哪一种动物,却能调用共同的 speak 方法。继承适合行为能被真实替代的关系;若子类不断重写父类大多数方法,可能需要改用组合。重写方法时要维持调用者依赖的返回类型和语义,不能只保证方法名相同。

动手练习

练习:让 Dog 继承 Animal 并返回“汪”。答案要点:只需覆盖 speak;announce(Dog()) 会调用子类方法。