第二十天- 多继承 经典MRO 新式MRO super()

# 多继承:# 在继承关系中.?类自动拥有?类中除私有属性外其他所有内容.python?持多继承.子类可拥有多?类.

 1 class ShenXian: # 神仙
 2
 3  def fei(self):
 4     print("神仙都会?")
 5
 6 class Monkey: # 猴
 7
 8  def chitao(self):
 9     print("猴?喜欢吃桃?")
10
11 class SunWukong(ShenXian, Monkey): # 孙悟空是神仙, 同时也是?只猴(自己有先自己,然后靠最近的,再其他)
12     pass
13
14 # sxz = SunWukong() # 孙悟空
15 # sxz.chitao() # 会吃桃?
16 # sxz.fei() # 会?
17
18 # 这就是多继承,但当两个?类中出现了重名?法的时候.就涉及到如何查找?类?法的问题.
19 # 即下面的 MRO(method resolution order) 问题

# 经典类MRO算法# 在python2.2之前用,现已弃用(做面试题参考) 采用的树形结构的深度递归遍历# 方法:从头开始.从左往右,一条道跑到底,然后回头.继续?条路跑到头.(画图)

 1 # 画图排顺序 现用python版本已无法验证
 2 class A:
 3  pass
 4 class B(A):
 5  pass
 6 class C(A):
 7  pass
 8 class D(B, C):
 9  pass
10 class E:
11  pass
12 class F(D, E):
13  pass
14 class G(F, D):
15  pass
16 class H:
17  pass
18 class Foo(H, G):
19  pass
20
21 #  结果 : FOO--H--G--F--D--B--A--C--E

# 新式类MRO算法(C3)# 先拆后合 从下向上合并,拿出每一项的头和后一项的身体进行比较.# 如果出现了就过,从后一项的头继续去比较.如果不出现就出来放到结果。# (注意:每次都是拿 头一项 的头和后面的身体比较,出现了就过,这时把后一项的头作为头一项继续去比较,# 若后一项的头在后面身体还有,继续这个操作...直到后面身体没有再返回前面的头,理解成一个循环)

 1 class A:
 2     pass
 3 class B(A):
 4     pass
 5 class C(A):
 6     pass
 7 class D(B, C):
 8     pass
 9 class E(C, A):
10     pass
11 class F(D, E):
12     pass
13 class M(F, E):
14     pass
15 class N:
16     pass
17 class P(M,N):
18     pass
19 class G(P):
20     pass
21 class O:
22     pass
23 class X(O):
24     pass
25 class H(G, X, F):
26     pass
27 print(H.__mro__)
28
29
30 ‘‘‘
31 # 拆 注意别漏了末尾的 “GXF”
32 # 当类里面只有单个继承时不需要
33 L(H) = H + L(G) + L(X) + L(F) + GXF     HGPMXFDBECANO
34
35 L(G) = G + L(P)               GPMFDBECAN
36 L(X) = X + L(O)               XO
37 L(F) = F + L(D) + L(E) + DE   FDBECA
38
39 L(P) = P + L(M) + L(N) + MN   PMFDBECAN
40 L(O) = O
41 L(D) = D + L(B) + L(C) + BC    DBCA
42 L(E) = E + L(C) + L(A) + CA    ECA
43
44 L(M) = M + L(F) + L(E) + FE    MFDBECA
45
46 L(N) = N
47 L(B) = B + L(A)  BA
48 L(C) = C + L(A)  CA
49 L(A) = A
50
51
52 #  HGPMXFDBECANO

continue...

原文地址:https://www.cnblogs.com/xi1419/p/9955681.html

时间: 2024-10-11 03:51:45

第二十天- 多继承 经典MRO 新式MRO super()的相关文章

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

#继承 class JiaoFu: def qd(self): print("教父带你祈祷") class Fu: def msj(self): print("alex喜欢msj") class Zi(Fu, JiaoFu): def dbj(self): print("刘伟喜欢大宝剑") z = Zi() z.msj() z.dbj() z.qd() class Base1: # Base1 object def func(self): pri

day6 面相对象编程 类的继承 经典类新式类

类变量与实例变量构造函数 __author__ = 'meng' class Foo: #n = 12345 #类变量 def __init__(self, name, age): # 构造函数 # 在实例化时做一些类的初始化工作 self.name = name #实例变量(静态属性),作用域就是实例本身 self.age = age def shot(self): #类的方法功能(动态属性) print ('%s.......' %(self.name)) obj = Foo('nick',

Python基础13_类与类型, MRO, C3算法, super()

一. python多继承 类与类型:http://www.cnblogs.com/blackmatrix/p/5594109.html 子类继承了多个父类, 当父类出现了重名方法时, 这时就涉及到查找父类方法的问题, 即MRO(method resolution order)问题 python中有两种类, 经典类和新式类 在Python2及以前的版本中,由任意内置类型派生出的类(只要一个内置类型位于类树的某个位置),都属于"新式类",都会获得所有"新式类"的特性:反

面向对象【day07】:类的属性-继承-经典类

本节内容 类的公有属性 析构函数 类的继承 新式类和经典类 一.类的公有属性 一.概述 前面我们讲了类的私有属性,现在我们来说说类的公有属性,这边很容易被人弄混淆,有人觉的,在__init__()构造方法中,除了私有属性,其他的都是公有属性了,其实这是一个错误的结论,并不是定义在__init__()初始化方法中的属性是公有属性(除私有属性),那什么是公有属性呢?揭起了大家的好奇心. 定义:指的是所属这个类的所有对象,都可以访问的属性,叫做公有属性. 二.公有属性 2.1 定义 说明:在类中直接定

C++继承经典样例

c++继承经典样例 #include <iostream.h> class Base { private: int b_number; public: Base( ){} Base(int i) : b_number (i) { } int get_number( ) {return b_number;} void print( ) {cout << b_number << endl;} }; class Derived : public Base { private:

python D20 多继承、C3算法、super()

# 今日大纲# 1.多继承# 继承:x是一种y的时候,可以使用继承关系."is a"# 一个类同时继承多个类(python, c++)# eg:孙悟空是猴子,还是神仙,还是妖怪 # 2.经典类的MRO# 通过树形结构的深度优先遍历# 一条道走到黑(从左往右) # 3.新式类的MRO(重点.面试题)c3算法# 先拆分# 在合并,第一项的头和后面所有项的身子(除了头以外的部分)进行比较,如果都没有就拿出来,如果出现了,就跳过到后一项,后一项查一个完在跳会原来的位置继续上述动作 # 4.su

第二十天:继承

什么是继承 继承指的是新建类的方法 新建的类称之为子类或者派生类 子类继承的类叫做父类,也 称之为基类或超类 继承的特征 子类可以继承父类的属性(特征与技能), 并且可以派生出自己的属性(特征与技能) 继承的目的 继承的目的是为了减少代码冗余(减少重复代码). 什么是抽象 抽象指的是抽取相似的部分,称之为抽象. 继承的关系 对象是特征与技能的结合体. 类是一系列对象相同的特征与技能的结合体. 继承是一系列类相同的特征与技能的结合体. 在继承背景下,对象属性的查找顺序 1.对象查找属性会先从对象的

接口与继承:方法覆盖(super)

源代码 //父类Parent class Parent{ int x; int y; Parent() { x = 0; y = 0; } public void Set(int a,int b) { x = a; y = b; } } //子类Child继承了Parent class Child extends Parent{ int z; Child() { super();//使用父类的构造方法初始化 z = 0; } public void Set(int a,int b)//与父类相同

04 Python的继承、方法重写、super()类

继承 A类继承B类,A即可获得B类的全部公共属性和方法.格式如:class A(B): class Animal: def sleep(self): print("zZZ...") def eat(self): print("yamiyami...") def run(self): print("huchihuchi...") class Dog(Animal): #Dog类拥有sleep,eat,run,bark四个方法 def bark(se