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/

原文地址:https://www.cnblogs.com/yunxiaofei/p/11198216.html

时间: 2024-10-08 19:31:14

python多继承与MRO的相关文章

Python多继承之MRO算法

MRO即Method Resolution Order   方法解析顺序,它的提出主要是为了解决Python中多继承时,当父类存在同名函数时,二义性的问题 下面先看一个例子: import inspect class D: pass class C(D): pass class B(D): pass class A(B, C): pass if __name__ == '__main__': print(inspect.getmro(A)) B和C继承D   A继承B和C  这是一个简单的多继承

python多继承中MRO问题

主要参考 http://python.jobbole.com/85685/ 算法更新顺序 DFS : 存在多继承中无法重写问题 BFS:存在继承单调性问题 C3算法:算法像是 拓扑排序+优先最左 的方式 原文地址:https://www.cnblogs.com/fuzzier/p/9897404.html

python基础——继承实现的原理

python基础--继承实现的原理 1 继承顺序 class A(object): def test(self): print('from A') class B(A): def test(self): print('from B') class C(A): def test(self): print('from C') class D(B): def test(self): print('from D') class E(C): def test(self): print('from E')

Python多继承解析顺序的C3线性算法流程解析

Python多继承MRO 在Python2.1中,采用了经典类,使用深度优先算法解析. Python2.2中,引入了新式类,使用深度优先算法和广度优先算法. 在Python2.3以后的版本中,经典类和新式类共存,使用了DFS算法和C3算法. Python2中的经典类 class A(object): pass Python3的新式类 class A: pass C3算法 In computing, the C3 superclass linearization is an algorithm u

Python 面向对象继承

一 什么是面向对象的继承 比较官方的说法就是: 继承(英语:inheritance)是面向对象软件技术当中的一个概念.如果一个类别A"继承自"另一个类别B,就把这个A称为"B的子类别",而把B称为"A的父类别"也可以称"B是A的超类".继承可以使得子类别具有父类别的各种属性和方法,而不需要再次编写相同的代码.在令子类别继承父类别的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类别的原有属性和方法,使其获得与父类别不同的功

python多继承

http://blog.csdn.net/pipisorry/article/details/46381341 There are two typical use cases forsuper: In a class hierarchy withsingle inheritance, super can be used to refer to parent classes withoutnaming them explicitly, thus making the code more maint

Python之继承

继承是所有开发语言的必修内容,而本文写的只是Python继承中的特殊之处,关于继承概念及内容可以自行百度(不装B,感觉百度挺好的) 1.构造函数: 要说继承,先要说一下构造函数.Java要求是与类名相同并且无返回值,而Python则是强制要求命名为"__init__()". 当创建类的对象时,会自动先调用构造函数,一般用于初始化.构造函数可以不写,那么程序会隐式自动增加一个空的构造函数. 2.继承写法: (1).class 空格 类名称 括号内填写父类名 冒号 具体写法如下 class

python - 回溯继承树 - 自己实现

# -*- coding: utf-8 -*- class test(object): pass class test1(test): pass class test2(test1): pass print test2.__bases__ print type(test2.__bases__[0]) print test2.__bases__[0].__bases__ print getattr(test2.__bases__[0], '__bases__') print '-' * 10 de

Python对象继承set类型

Python对象继承set类型 class Feature(set): def __init__(self): set.__init__(self) # 这里演示将Feature类的加号重载成set.add方法 def __add__(self, feature): set.add(self, feature)