多重繼承 <python>

一入深坑深思海,苦心專愁运怖,愁更愁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'>]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末埠偿,一起剝皮案震驚了整個濱河市透罢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌冠蒋,老刑警劉巖羽圃,帶你破解...
    沈念sama閱讀 221,331評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異抖剿,居然都是意外死亡朽寞,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評論 3 398
  • 文/潘曉璐 我一進店門斩郎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來脑融,“玉大人,你說我怎么就攤上這事缩宜≈庥” “怎么了?”我有些...
    開封第一講書人閱讀 167,755評論 0 360
  • 文/不壞的土叔 我叫張陵锻煌,是天一觀的道長妓布。 經(jīng)常有香客問我,道長宋梧,這世上最難降的妖魔是什么匣沼? 我笑而不...
    開封第一講書人閱讀 59,528評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮捂龄,結(jié)果婚禮上释涛,老公的妹妹穿的比我還像新娘加叁。我一直安慰自己,他們只是感情好枢贿,可當我...
    茶點故事閱讀 68,526評論 6 397
  • 文/花漫 我一把揭開白布殉农。 她就那樣靜靜地躺著,像睡著了一般局荚。 火紅的嫁衣襯著肌膚如雪超凳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,166評論 1 308
  • 那天耀态,我揣著相機與錄音轮傍,去河邊找鬼。 笑死首装,一個胖子當著我的面吹牛创夜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播仙逻,決...
    沈念sama閱讀 40,768評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼驰吓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了系奉?” 一聲冷哼從身側(cè)響起檬贰,我...
    開封第一講書人閱讀 39,664評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缺亮,沒想到半個月后翁涤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,205評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡萌踱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,290評論 3 340
  • 正文 我和宋清朗相戀三年葵礼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片并鸵。...
    茶點故事閱讀 40,435評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡鸳粉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出园担,到底是詐尸還是另有隱情届谈,我是刑警寧澤,帶...
    沈念sama閱讀 36,126評論 5 349
  • 正文 年R本政府宣布粉铐,位于F島的核電站疼约,受9級特大地震影響卤档,放射性物質(zhì)發(fā)生泄漏蝙泼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,804評論 3 333
  • 文/蒙蒙 一劝枣、第九天 我趴在偏房一處隱蔽的房頂上張望汤踏。 院中可真熱鬧织鲸,春花似錦、人聲如沸溪胶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,276評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哗脖。三九已至瀑踢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間才避,已是汗流浹背橱夭。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留桑逝,地道東北人棘劣。 一個月前我還...
    沈念sama閱讀 48,818評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像楞遏,于是被迫代替她去往敵國和親茬暇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,442評論 2 359

推薦閱讀更多精彩內(nèi)容