Skip to content

继承

继承允许一个类(子类)继承另一个类(父类)的属性和方法。通过继承,我们可以实现代码复用,减少重复代码,提高代码可维护性和可扩展性。

继承的概念

  • 父类 (基类): 被继承的类,也称为超类。
  • 子类 (派生类): 继承父类的类,也称为子类。
  • 继承关系: 子类继承父类的属性和方法,并可以扩展或修改父类的功能。

继承的定义

在 Python 中,使用 class 子类名(父类名) 语法实现继承。

python
class 父类名:
    # 父类属性和方法

class 子类名(父类名):
    # 子类属性和方法
    
class 父类名2:
    # 父类属性和方法
    
class 子类名(父类名父类名2):  # 多层继承
    # 子类属性和方法

继承的机制

  • 属性继承: 子类自动继承父类的所有属性,包括私有属性(以双下划线 __ 开头的属性)。
  • 方法继承: 子类自动继承父类的所有方法,包括私有方法(以双下划线 __ 开头的 方法)。
  • 方法覆盖: 子类可以重写父类的方法,实现不同的行为。

继承示例

在这个例子中,DogCatBird 类都继承了 Animal 类,它们都拥有 namespecies 属性,并可以调用 speak() 方法。但由于 speak() 方法被子类覆盖,每个子类都实现了不同的行为。

python
class Animal:
    def __init__(self, name, species):
        self.name = name
        self.species = species

    def speak(self):
        print(f"{self.name} makes a sound.")

class Dog(Animal):
    def speak(self):
        print(f"{self.name} barks!")

class Cat(Animal):
    def speak(self):
        print(f"{self.name} meows!")

class Bird(Animal):
    def speak(self):
        print(f"{self.name} tweets!")

# 创建动物实例
dog = Dog("Buddy", "Golden Retriever")
cat = Cat("Whiskers", "Siamese")
bird = Bird("Tweety", "Canary")

# 调用 speak() 方法
dog.speak()   # 输出:Buddy barks!
cat.speak()   # 输出:Whiskers meows!
bird.speak()  # 输出:Tweety tweets!

多层继承

Python 支持多层继承,即子类可以继承多个父类。Python 使用 深度优先搜索 方式来查找属性和方法,如果在子类中没有找到,则会向上查找父类,直到找到为止。如下:子类 C 继承了 AB 类的属性和方法。

python
class A:
    # ...

class B:
    # ...

class C(A, B):
    # ...

当一个类有多个父类时,Python 使用方法解析顺序 (Method Resolution Order) 来确定方法调用的顺序。MRO 遵循 C3 算法,确保所有父类都被访问到。

python
class A:
    def speak(self):
        print("A")

class B(A):
    def speak(self):
        print("B")

class C(A):
    def speak(self):
        print("C")

class D(B, C):
    pass

d = D()
d.speak()  # 输出:B

在这个例子中,D 继承了 BC,而 BC 都继承了 A。由于 D 的 MRO 是 D, B, C, A,所以 d.speak() 最终会调用 B 类的 speak() 方法。

注意事项

  • 使用继承时,要注意 代码耦合性,尽量保持父类和子类之间的关系合理,避免过度耦合。
  • 可以利用 抽象类接口 来定义更通用的方法和属性,提高代码的可扩展性和灵活性。

总结

Python 的继承机制为我们提供了代码复用、扩展和维护的强大工具。通过理解继承的概念和机制,我们可以更好地组织代码结构,提高代码质量,并构建更加灵活和可扩展的软件系统。

Released under the MIT License.