Python:重載構(gòu)造方法

對(duì)于使用過C++的人來說踏枣,構(gòu)造函數(shù)與析構(gòu)函數(shù)不會(huì)陌生刑赶。
構(gòu)造函數(shù)在對(duì)象創(chuàng)建時(shí)被調(diào)用谆膳,析構(gòu)函數(shù)在對(duì)象被銷毀時(shí)被調(diào)用。而Python中也有類似的特殊函數(shù):__new__脯倒,__init__实辑,__del__

其中__new____init__共同構(gòu)成了C++中的構(gòu)造函數(shù)藻丢,__del__為析構(gòu)函數(shù)剪撬。


__new__在對(duì)象被創(chuàng)建時(shí)被調(diào)用,而__init__在對(duì)象被初始化時(shí)被調(diào)用悠反。

  1. __new__ 的第一個(gè)參數(shù)是對(duì)象本身残黑,其他的參數(shù)是用來直接傳遞給 __init__ 方法馍佑。 __new__ 方法相當(dāng)不常用,但是當(dāng)繼承一個(gè)不可變的類型(比如一個(gè)tuple或者string)時(shí)梨水,它將派上用場(chǎng)拭荤。但這已經(jīng)超出了基礎(chǔ)的范圍,所以暫且不提疫诽。
  2. __init__十分常見舅世,用以初始化對(duì)象。當(dāng)父類擁有該函數(shù)奇徒,而繼承的子類想要調(diào)用父類的__init__雏亚,應(yīng)該使用super().__init__()而不是父類名.__init__(),以此來避免多繼承問題摩钙。

__del__在對(duì)象被銷毀時(shí)被調(diào)用评凝,但它并不是實(shí)現(xiàn)del語法的內(nèi)置函數(shù)。它定義的是對(duì)象被銷毀時(shí)的行為腺律,但由于Python的GC問題奕短,所以對(duì)象銷毀的時(shí)刻無法由編寫者完全自控,所以用處也較少匀钧。

附:多繼承問題

多繼承問題是一個(gè)古老的 Feature(當(dāng)一個(gè)Bug沒法修的時(shí)候就叫 Feature)翎碑。讓我們運(yùn)行如下代碼

class A():
    def __init__(self):
        print("進(jìn)入A…")
        print("離開A…")

class B(A):
    def __init__(self):
        print("進(jìn)入B…")
        A.__init__(self)
        print("離開B…")
        
class C(A):
    def __init__(self):
        print("進(jìn)入C…")
        A.__init__(self
        print("離開C…")

class D(B, C):
    def __init__(self):
        print("進(jìn)入D…")
        B.__init__(self)
        C.__init__(self)
        print("離開D…")

d = D()

結(jié)果如下

進(jìn)入D…
進(jìn)入B…
進(jìn)入A…
離開A…
離開B…
進(jìn)入C…
進(jìn)入A…
離開A…
離開C…
離開D…

可以看到,A的__init__被調(diào)用了兩次之斯。而這并不是我們期待的日杈。為此在有些語言里,禁止了多繼承佑刷。

Python的解決方法是:使用super()調(diào)用父類方法莉擒。

class A():
    def __init__(self):
        print("進(jìn)入A…")
        print("離開A…")

class B(A):
    def __init__(self):
        print("進(jìn)入B…")
        super().__init__()
        print("離開B…")
        
class C(A):
    def __init__(self):
        print("進(jìn)入C…")
        super().__init__()
        print("離開C…")

class D(B, C):
    def __init__(self):
        print("進(jìn)入D…")
        super().__init__()
        print("離開D…")

d = D()

運(yùn)行結(jié)果如下

進(jìn)入D…
進(jìn)入B…
進(jìn)入C…
進(jìn)入A…
離開A…
離開C…
離開B…
離開D…

這樣A的__init__只被調(diào)用了一次

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市瘫絮,隨后出現(xiàn)的幾起案子涨冀,更是在濱河造成了極大的恐慌,老刑警劉巖麦萤,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹿鳖,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡壮莹,警方通過查閱死者的電腦和手機(jī)翅帜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來命满,“玉大人涝滴,你說我怎么就攤上這事。” “怎么了歼疮?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵杂抽,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我腋妙,道長(zhǎng)默怨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任骤素,我火速辦了婚禮匙睹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘济竹。我一直安慰自己痕檬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布送浊。 她就那樣靜靜地躺著梦谜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪袭景。 梳的紋絲不亂的頭發(fā)上唁桩,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音耸棒,去河邊找鬼荒澡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛与殃,可吹牛的內(nèi)容都是我干的单山。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼幅疼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼米奸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起爽篷,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤悴晰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后狼忱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體膨疏,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年钻弄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片者吁。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡窘俺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瘤泪,我是刑警寧澤灶泵,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站对途,受9級(jí)特大地震影響赦邻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜实檀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一惶洲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧膳犹,春花似錦恬吕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至豺旬,卻和暖如春钠惩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背族阅。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工篓跛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人耘分。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓举塔,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親求泰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子央渣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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