====== 第十四章:继承与多态 ====== ===== 本章目标 ===== 完成本章学习后,你将能够: * 理解继承的概念和用途 * 实现单继承和多继承 * 使用方法重写和super() * 理解多态和鸭子类型 * 掌握抽象基类 ===== 继承基础 ===== ==== 单继承 ==== class Animal: """动物基类""" def __init__(self, name): self.name = name def speak(self): raise NotImplementedError("子类必须实现此方法") def info(self): return f"{self.name} is an animal" class Dog(Animal): # Dog继承Animal """狗类""" def __init__(self, name, breed): super().__init__(name) # 调用父类构造方法 self.breed = breed def speak(self): # 方法重写(覆盖) return f"{self.name} says woof!" def fetch(self): # 子类特有方法 return f"{self.name} is fetching" class Cat(Animal): """猫类""" def speak(self): return f"{self.name} says meow!" # 使用 dog = Dog("Buddy", "Golden Retriever") cat = Cat("Whiskers") print(dog.speak()) # Buddy says woof! print(cat.speak()) # Whiskers says meow! print(dog.fetch()) # Buddy is fetching print(dog.info()) # Buddy is an animal(继承的方法) ==== super()函数 ==== class A: def __init__(self): print("A.__init__") self.a = "A" class B(A): def __init__(self): print("B.__init__") super().__init__() # 调用A的__init__ self.b = "B" class C(B): def __init__(self): print("C.__init__") super().__init__() # 调用B的__init__(实际是调用MRO中的下一个) self.c = "C" # MRO(方法解析顺序) print(C.__mro__) # (, , , ) ===== 多继承 ===== class Flyable: def fly(self): return f"{self.name} is flying" class Swimmable: def swim(self): return f"{self.name} is swimming" class Duck(Animal, Flyable, Swimmable): # 多继承 def __init__(self, name): super().__init__(name) def speak(self): return f"{self.name} says quack!" # 使用 duck = Duck("Donald") print(duck.speak()) # Donald says quack! print(duck.fly()) # Donald is flying print(duck.swim()) # Donald is swimming ==== MRO和菱形继承 ==== class A: def method(self): print("A") class B(A): def method(self): print("B") super().method() class C(A): def method(self): print("C") super().method() class D(B, C): # 菱形继承 def method(self): print("D") super().method() # MRO: D -> B -> C -> A -> object print(D.__mro__) d = D() d.method() # 输出: # D # B # C # A ===== 多态与鸭子类型 ===== ==== 多态 ==== class Animal: def speak(self): pass class Dog(Animal): def speak(self): return "Woof!" class Cat(Animal): def speak(self): return "Meow!" def animal_concert(animals): """多态:不同类型的对象以相同接口处理""" for animal in animals: print(animal.speak()) # 同一接口,不同行为 animals = [Dog(), Cat(), Dog()] animal_concert(animals) ==== 鸭子类型 ==== class Duck: def swim(self): print("Duck swimming") def fly(self): print("Duck flying") class Swan: def swim(self): print("Swan swimming") def fly(self): print("Swan flying") class Goose: def swim(self): print("Goose swimming") def fly(self): print("Goose flying") def water_bird_demo(bird): """ 鸭子类型:不关注对象类型,只关注是否有需要的方法 "如果它走起来像鸭子,叫起来像鸭子,那它就是鸭子" """ bird.swim() bird.fly() # 不同类型的对象都可以传入 water_bird_demo(Duck()) water_bird_demo(Swan()) water_bird_demo(Goose()) ===== 抽象基类 ===== from abc import ABC, abstractmethod class Shape(ABC): # 抽象基类 @abstractmethod def area(self): """子类必须实现此方法""" pass @abstractmethod def perimeter(self): pass def info(self): # 可以有具体方法 return f"Area: {self.area()}, Perimeter: {self.perimeter()}" class Rectangle(Shape): def __init__(self, width, height): self.width = width self.height = height def area(self): return self.width * self.height def perimeter(self): return 2 * (self.width + self.height) # shape = Shape() # TypeError: 不能实例化抽象类 rect = Rectangle(5, 3) print(rect.info()) ===== 本章小结 ===== 本章我们学习了: * 单继承和多继承 * super()和MRO * 多态和鸭子类型 * 抽象基类 下一章:[[python_course:chapter15|第十五章:模块与包]]