zoukankan      html  css  js  c++  java
  • python多继承与MRO

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

    继承不是复制,子类如果有,就用子类的,子类如果没有,就按照MRO返回的顺序去父类中寻找。

    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/

  • 相关阅读:
    常用javascript 小强斋
    EJB>持久化实体管理器EntityManager 小强斋
    常用javascript 小强斋
    常用javascript 小强斋
    JSF>事件处理Phase 事件 小强斋
    EJB>持久化实体管理器EntityManager 小强斋
    EJB>持久化实体管理器EntityManager 小强斋
    EJB>实体bean的属性映射 小强斋
    JSF>表格处理 小强斋
    JSF>JSF 生命周期 小强斋
  • 原文地址:https://www.cnblogs.com/yunxiaofei/p/11198216.html
Copyright © 2011-2022 走看看