Skip to content

继承性是面向对象编程(OOP)中的一个核心概念,在 Python 里它允许一个类(子类或派生类)继承另一个类(父类、基类或超类)的属性和方法。

1. 继承示例

python
class ParentClass:
    def __init__(self):
        pass

    def parent_method(self):
        print("这是父类的方法")

class ChildClass(ParentClass):
    def __init__(self):
        # 调用父类的构造方法
        super().__init__()

    def child_method(self):
        print("这是子类的方法")

# 创建子类的实例
child = ChildClass()
# 调用父类的方法
child.parent_method()
# 调用子类的方法
child.child_method()

输出内容:

text
这是父类的方法
这是子类的方法

在上述代码中,ChildClass 继承自 ParentClass,所以 ChildClass 的实例可以调用 ParentClass 中的 parent_method 方法, 同时还可以调用自身定义的 child_method 方法。

2. 继承性实现代码复用

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

    def eat(self):
        print(f"{self.name} 正在进食")

    def sleep(self):
        print(f"{self.name} 正在睡觉")

class Cat(Animal):
    def meow(self):
        print(f"{self.name} 喵喵叫")

class Dog(Animal):
    def bark(self):
        print(f"{self.name} 汪汪叫")

# 创建猫和狗的实例
cat = Cat("咪咪", 2)
dog = Dog("旺财", 3)

# 调用继承的方法
cat.eat()
dog.sleep()
# 调用子类特有的方法
cat.meow()
dog.bark()

输出内容:

text
咪咪 正在进食
旺财 正在睡觉
咪咪 喵喵叫
旺财 汪汪叫

该示例通过继承避免了重复编写代码,提高代码的复用性。

3. 多继承

多继承指的是一个子类能够同时继承多个父类的属性和方法。

3.1. 多继承示例

python
class ParentClass1:
    def method1(self):
        print("This is method from ParentClass1")


class ParentClass2:
    def method2(self):
        print("This is method from ParentClass2")


class ChildClass(ParentClass1, ParentClass2):
    pass


# 创建子类的实例
child = ChildClass()
# 调用父类 1 的方法
child.method1()
# 调用父类 2 的方法
child.method2()

输出内容:

text
This is method from ParentClass1
This is method from ParentClass2

3.2. 菱形继承问题

菱形继承是多继承中常见的问题,当一个子类继承自两个父类,而这两个父类又继承自同一个祖父类时,就会形成菱形结构。 这可能会导致方法调用的不确定性和代码的复杂性增加。
Python 使用方法解析顺序(Method Resolution Order,MRO)来确定在多继承情况下调用方法的顺序。可以通过 mro 属性查看类的 MRO。

python
class A:
    def method(self):
        print("A's method")


class B(A):
    def method(self):
        print("B's method")


class C(A):
    def method(self):
        print("C's method")


class D(B, C):
    pass


print(D.__mro__)
d = D()
d.method()

输出内容:

text
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
B's method