[Python] 类的多重继承

4.4 类的多重继承

在编程中在定义类时,如果继承了多个类,则称为多重继承。它允许子类从多个不同的父类中继承属性和方法。比如,天马类同时继承哺乳动物类和鸟类:

class Animal:
    def eat(self):
        print('我饿了')

    def sleep(self):
        print('我困了')


class Mammal(Animal):
    def walk(self):
        print('我会走')


class Bird(Animal):
    def fly(self):
        print('我会飞')


class Tianma(Mammal, Bird):
    ...


tianma = Tianma()
tianma.eat()
tianma.sleep()
tianma.walk()
tianma.fly()

我饿了
我困了
我会走
我会飞

4.4.1 MRO(继承解析顺序)

在Python中,MRO代表方法解析顺序(Method Resolution Order)。它决定了当子类继承多个父类时,调用方法的顺序。
Python使用C3算法来计算MRO。其基本规则是从左到右继承所有父类,并保持每个类在列表中的第一次出现的顺序。此外,如果一个类有多个超类,Python会尝试通过合并超类的序列来创建一个线性MRO。
为了查找一个方法,Python会沿着MRO链往下搜索,直到找到该方法或者到达链的末尾。如果在所有类中都找不到所需的方法,则会引发 AttributeError 异常。
以下是一个示例代码段,展示了如何使用super()函数以及MRO顺序来调用父类的方法:

class A:
    def foo(self):
        print("A")

class B(A):
    def foo(self):
        super().foo()
        print("B")

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

class D(B, C):
    pass

d = D()
d.foo()  # 输出 A B

在这个示例中,D 类继承了 B 和 C 两个类。它的 MRO 顺序为 [D, B, C, A],因此当我们调用 d.foo() 方法时,Python 会先调用 B 类中的 foo() 方法(由于使用了 super() 函数),然后再在 A 类中找到 foo() 方法。
可以通过类的__mro__属性来查看类的mro列表:
>>> print(Tianma.mro)

(<class ‘main.Tianma’>, <class ‘main.Mammal’>, <class ‘main.Bird’>, <class ‘main.Animal’>, <class ‘object’>)

猜你喜欢

转载自blog.csdn.net/crleep/article/details/131547974
今日推荐