一入深坑深思海,苦心專愁运怖,愁更愁F雌!摇展!
不惜一切代價地避免多重繼承吻氧,它帶來的麻煩比能解決的問題都多。
如果你非要用咏连,那你得準備好專研類的層次結(jié)構(gòu)盯孙,以及花時間去找各種東西的來龍去脈吧
可以試試組合,組合則是利用模塊和別的類中的函數(shù)調(diào)用實現(xiàn)了相同的目的
經(jīng)典類中MRO搜索采用簡單的從左到右的深度優(yōu)先順序
super()可以保證菱形頂部的公共基類的init()方法只會運行一次
新式類是廣度優(yōu)先
# 8-1
'''去除A 則self.value將不存在'''
class A(object):
def __init__(self,value):
self.value=value
print("A --> {}".format(self.value))
class B(object):
def __init__(self):
self.value*=10
print("B --> {}".format(self.value))
class C(object):
def __init__(self):
self.value+=100
print("C --> {}".format(self.value))
class D(A,B,C):
def __init__(self,value):
A.__init__(self,value)
B.__init__(self)
C.__init__(self)
print("D --> {}".format(self.value))
'''多重繼承的順序的實例'''
class E(A,B,C):
def __init__(self,value):
A.__init__(self,value)
C.__init__(self)
B.__init__(self)
print("E --> {}".format(self.value))
class F(A,C,B):
def __init__(self,value):
A.__init__(self,value)
B.__init__(self)
C.__init__(self)
print("F --> {}".format(self.value))
d=D(1)
e=E(1)
f=F(1)
from pprint import pprint
pprint(D.mro())
pprint(F.mro())
A --> 1
B --> 10
C --> 110
D --> 110
A --> 1
C --> 101
B --> 1010
E --> 1010
A --> 1
B --> 10
C --> 110
F --> 110
[<class '__main__.D'>,
<class '__main__.A'>,
<class '__main__.B'>,
<class '__main__.C'>,
<class 'object'>]
[<class '__main__.F'>,
<class '__main__.A'>,
<class '__main__.C'>,
<class '__main__.B'>,
<class 'object'>]
# 8-2
'''
使用舊版繼承,基礎(chǔ)類A.__init__ 會調(diào)用多次
A --> 1
H --> 11
A --> 1
G --> 4
J --> 4
JHGA:先左后右祟滴,H-G
注掉G.init
A --> 1
H --> 11
J --> 11
JHGA:左右
再改H.init--->super()
A --> 1
G --> 4
H --> 14
J --> 14
JHGA:深度優(yōu)先即G執(zhí)行振惰,H為super()也可執(zhí)行
注掉H.init
A --> 1
G --> 4
J --> 4
JHGA:左右
再改G.init--->super()
A --> 1
G --> 4
J --> 4
JHGA:深度優(yōu)先G執(zhí)行,H沒有init
注意關(guān)鍵的地方來了踱启,所有的初始化方法會按照跟那些__init__()相反的順序來運行
'''
class A(object):
def __init__(self,value):
self.value=value
print("A --> {}".format(self.value))
class G(A):
def __init__(self,value):
# A.__init__(self,value)
super(G,self).__init__(value)
self.value*=4
print("G --> {}".format(self.value))
class H(A):
def __init__(self,value):
A.__init__(self,value)
# super(H,self).__init__(value)
self.value+=10
print("H --> {}".format(self.value))
class J(H,G):
def __init__(self,value):
# H.__init__(self,value)
G.__init__(self,value)
print("J --> {}".format(self.value))
j=J(1)
from pprint import pprint
pprint(J.mro())
A --> 1
G --> 4
J --> 4
[<class '__main__.J'>,
<class '__main__.H'>,
<class '__main__.G'>,
<class '__main__.A'>,
<class 'object'>]
# 8-3
'''
全super()只執(zhí)行一次
A --> 1
G --> 4
H --> 14
I --> 14
G.super(),H.init
A --> 1
H --> 11
I --> 11
IHGA:有init,左開始报账,H執(zhí)行。G時因super,A不再執(zhí)行
G.init,H.super()
A --> 1
G --> 4
H --> 14
I --> 14
IHGA:執(zhí)行廣度優(yōu)先
'''
class A(object):
def __init__(self,value):
self.value=value
print("A --> {}".format(self.value))
class G(A):
def __init__(self,value):
super(G,self).__init__(value)
# A.__init__(self,value)
self.value*=4
print("G --> {}".format(self.value))
class H(A):
def __init__(self,value):
# super(H,self).__init__(value)
A.__init__(self,value)
self.value+=10
print("H --> {}".format(self.value))
class I(H,G):
def __init__(self,value):
super(I,self).__init__(value)
print("I --> {}".format(self.value))
i=I(1)
from pprint import pprint
pprint(I.mro())
A --> 1
H --> 11
I --> 11
[<class '__main__.I'>,
<class '__main__.H'>,
<class '__main__.G'>,
<class '__main__.A'>,
<class 'object'>]