一.继承,多继承
子类继承父类:为父类进行扩展
MRO(method resolution order) 方法解析顺序
python 2
1.使用经典类(写继承关系的时候,基类不继承object)
2.新式类(继承关系的根,是object)
python 3
只有新式类
二.经典类的MRO
经典类的MRO使用的是深度优先遍历
从左到右,一直走到头,每个走一次
三.新式类的MRO C3
1.新式类中摒弃了(部分)的深度优先算法,使用C3算法
2.如果你的继承关系中没有菱形继承,深度优先来计算MRO
有菱形继承,使用C3算法来计算MRO
3.C3算法
先拆分再合并
拆分 : 例如拆分H : L(H) = H + L(G) + L(F) + GF
合并 : 例如合并C: L(C) = C + L(A) + A = CA
class A:
pass
class B(A):
pass
class C(A):
pass
class D(B, C):
pass
class E(C, A):
pass
class F(D, E):
pass
class M:
pass
class N(M):
pass
class P(E, A):
pass
class X:
pass
class Q(P, N, X):
pass
class G(Q, F):
pass
class H(G, F):
pass
'''
求H的MRO
设求MRO的算法是L
L(H) = H + L(G) + L(F) + GF
L(G) = G + L(E) + E
L(E) = E + L(C) + L(A) + CA
L(C) = C + L(A) + A
L(A) = A
L(F) = F + L(D) + L(E) + DE
L(D) = D + L(B) + L(C) + BC
L(B) = B + L(A) + A
# 加法:merge(), 拿第一项的第一位和 后面每项的除了第一位比较. 如果没有出现, 则该位元素算出
如果出现了. 此时开始下一项的第一位继续和后面每一项的除了第一位比较:
用头和后面身体比较
L(H) = H + L(G) + L(F) + GF # ECA + DBECA = HGFDBECAO
L(G) = G + L(E) + E # GECA
L(E) = E + L(C) + L(A) + CA # ECA
L(C) = C + L(A) + A # CA
L(A) = A
L(F) = F + L(D) + L(E) + DE # FDBECA
L(D) = D + L(B) + L(C) + BC # DBCA
L(B) = B + A + A # BA
'''
print(H.__mro__)
四.super()
super()可以访问MRO中的下一个类中的内容.找父类
super(类名,self) 从某个类开始找下一个MRO
先算MRO顺序,再看清楚self是谁,在什么是进行计算
class Init(object):
def __init__(self, v): # 2
print("init")
self.val = v
class Add2(Init):
def __init__(self, val): # 2
print("Add2")
super(Add2, self).__init__(val) # Mult
print(self.val)
self.val += 2
class Mult(Init):
def __init__(self, val):
print("Mult")
super(Mult, self).__init__(val) # Haha
self.val *= 5
class HaHa(Init):
def __init__(self, val):
print("哈哈")
super(HaHa, self).__init__(val) # Init
self.val /= 5
class Pro(Add2,Mult,HaHa): #
pass
class Incr(Pro): # incr->pro->add2->Mult->HaHa->init
def __init__(self, val): # 5
super(Incr, self).__init__(val) # Add2
self.val += 1
p = Incr(5)
print(p.val)
c = Add2(2)
print(c.val)