python多继承与MRO

Posted yunxiaofei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python多继承与MRO相关的知识,希望对你有一定的参考价值。

所有的函数名都可以理解为变量。python中就不存在类似C++的重载,因为python不允许出现相同的函数名。类的继承中,如果我们重写(overriding)一个函数,那不是重载,这个函数会覆盖父类中的同名函数。

C3算法:保证每个类只调用一次

1. 什么是多继承

多继承就是一个类有多个父类。

技术图片

class Mother:
  pass
class Father:
  pass
class Child(Mother, Father):
  pass
issubclass(Child, Mother) and issubclass(Child, Father)

2. MRO(Method Resolution Order)

MRO给出了子类中属性的调用顺序,如果要查看顺序可以使用__mro__属性,或者mro()方法。

__mro__属性返回一个元组,mro()方法返回一个列表,内容是一样的。

技术图片

3. 多继承中的纠纷

如果继承的多个父类中有一个共同的属性,这个子类会继承谁的值呢?

我们来看下面这个例子:

技术图片

从中可以看出,该子类继承了第一个父类的属性。

4. super()函数

多继承当中也经常用到super函数。下面这个例子中,我们定义了四个类,super函数启动后,会从mro列表中寻找下一个调用,所以,TestStudent会先调用Student类中的send_email方法,然后调用MockPerson中的send_email方法,此时没有再发生跳转了,也就结束了。

技术图片

技术图片

这里再稍微对MockPerson改动一下,新增一行super函数:

class Person:
    def send_email(self):
        print("Email Send")
    
class Student(Person):
    def send_email(self):
        print("About to Send")
        super(Student, self).send_email()
        
class MockPerson(Person):
    def send_email(self):
        print("Mock")
        super(MockPerson, self).send_email()


class TestStudent(Student, MockPerson):
    def send_email(self):
        print("Testing")
        super(TestStudent, self).send_email()

返回值如下:

技术图片

 

参考链接: 

[1] https://data-flair.training/blogs/python-multiple-inheritance/

[2] https://bytes.vokal.io/20151207-python-super-mro/

以上是关于python多继承与MRO的主要内容,如果未能解决你的问题,请参考以下文章

Python的多继承问题-MRO和C3算法

python多继承中MRO问题

Python 面向对象 之 多继承 MRO

python的继承,多继承,经典类的MRO,新式类的MRO,C3算法,super

Python多继承之MRO算法

Python 面向对象 之 多继承 MRO