Python類的__init__和__new__方法

__new__方法

作用: 用來創(chuàng)建一個類的實例,有返回值,返回當(dāng)前類的一個新的實例.
屬性: 是一個靜態(tài)方法,被請求的類作為第一個參數(shù),返回值值通常是類的新的對象實例.
如果__new__()返回類的新的實例,則__init__()方法將會對這個心的實例進(jìn)行初始化.
如果__new__()沒有返回類的新的實例,那么新的實例的__init__()方法將不會被調(diào)用

# encoding:utf-8
__author__ = 'Fioman'
__time__ = '2019/3/6 13:13'


class Person(object):
    def __new__(cls, name, age):
        print('__new__()方法被調(diào)用')
        return super(Person, cls).__new__(cls)

    def __init__(self, name, age):
        print('__init__()方法被調(diào)用')
        self.name = name
        self.age = age

    def __str__(self):
        return '<Person: {}{}>'.format(self.name, self.age)


if __name__ == '__main__':
    p = Person('fioman', '24')
    print(p)

一些說明:
1鞭缭、繼承自object的新式類才有__new__

2碍粥、__new__至少要有一個參數(shù)cls渐扮,代表當(dāng)前類合冀,此參數(shù)在實例化時由Python解釋器自動識別

3向楼、__new__必須要有返回值,返回實例化出來的實例,這點在自己實現(xiàn)__new__時要特別注意,可以return父類(通過super(當(dāng)前類名, cls))__new__出來的實例喉酌,或者直接是object的__new__出來的實例

4热凹、__init__有一個參數(shù)self泵喘,就是這個__new__返回的實例,__init____new__的基礎(chǔ)上可以完成一些其它初始化的動作般妙,init不需要返回值

5纪铺、如果__new__創(chuàng)建的是當(dāng)前類的實例,會自動調(diào)用__init__函數(shù)碟渺,通過return語句里面調(diào)用的__new__函數(shù)的第一個參數(shù)是 cls 來保證是當(dāng)前類實例鲜锚,如果是其他類的類名,苫拍;那么實際創(chuàng)建返回的就是其他類的實例芜繁,其實就不會調(diào)用當(dāng)前類的__init__函數(shù),也不會調(diào)用其他類的__init__函數(shù)绒极。

6骏令、在定義子類時沒有重新定義__new__()時,Python默認(rèn)是調(diào)用該類的直接父類的__new__()方法來構(gòu)造該類的實例垄提,如果該類的父類也沒有重寫__new__()榔袋,那么將一直按此規(guī)矩追溯至object的__new__()方法周拐,因為object是所有新式類的基類。

7凰兑、而如果子類中重寫了__new__()方法妥粟,那么你可以自由選擇任意一個的其他的新式類(必定要是新式類,只有新式類必定都有__new__()吏够,因為所有新式類都是object的后代勾给,而經(jīng)典類則沒有__new__()方法)的__new__()方法來制造實例,包括這個新式類的所有前代類和后代類稿饰,只要它們不會造成遞歸死循環(huán)锦秒。反正肯定不能調(diào)用自己的__new__,這肯定是死循環(huán)喉镰。

8旅择、對于子類的__init__,其調(diào)用規(guī)則跟__new__是一致的侣姆,當(dāng)然如果子類和父類的__init__函數(shù)都想調(diào)用生真,可以在子類的__init__函數(shù)中加入對父類__init__函數(shù)的調(diào)用。

9捺宗、我們在使用時柱蟀,盡量使用__init__函數(shù),不要去自定義__new__函數(shù)蚜厉,因為這兩者在繼承派生時的特性還是很不一樣的长已。

10、將類比作制造商昼牛,__new__方法就是前期的原材料購買環(huán)節(jié)术瓮,__init__方法就是在有原材料的基礎(chǔ)上,加工贰健,初始化商品環(huán)節(jié)

__init__方法
init__()方法在new()方法創(chuàng)建實例后胞四,實例被返回給調(diào)用者之前調(diào)用。它的參數(shù)是傳遞給構(gòu)造表達(dá)式的那些參數(shù)伶椿。如果基類具有init()方法辜伟,那么派生類的init()方法(如果有)必須顯示調(diào)用調(diào)用基類的_init-()方法,如:super().init([args...]).

因為new()方法和init()方法在創(chuàng)建對象時是一起工作的(new()創(chuàng)建對象脊另,init()自定義對象)导狡,而init()方法可能會返回一個非None的值,如果真是這樣偎痛,那么運行時可能會導(dǎo)致TypeError.

區(qū)別:
A. __new__是一個靜態(tài)方法旱捧,而__init__是一個實例方法
B. __new__方法會返回一個創(chuàng)建的實例,而__init__什么都不返回
C. 只有在__new__返回一個cls的實例時看彼,后面的__init__才能被調(diào)用
D. 當(dāng)創(chuàng)建一個新實例時調(diào)用__new__廊佩,初始化一個實例時用__init__

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末囚聚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子标锄,更是在濱河造成了極大的恐慌顽铸,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件料皇,死亡現(xiàn)場離奇詭異谓松,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)践剂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進(jìn)店門鬼譬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人逊脯,你說我怎么就攤上這事优质。” “怎么了军洼?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵巩螃,是天一觀的道長。 經(jīng)常有香客問我匕争,道長避乏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任甘桑,我火速辦了婚禮拍皮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘跑杭。我一直安慰自己铆帽,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布艘蹋。 她就那樣靜靜地躺著锄贼,像睡著了一般票灰。 火紅的嫁衣襯著肌膚如雪女阀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天屑迂,我揣著相機(jī)與錄音浸策,去河邊找鬼。 笑死惹盼,一個胖子當(dāng)著我的面吹牛庸汗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播手报,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蚯舱,長吁一口氣:“原來是場噩夢啊……” “哼改化!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起枉昏,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤陈肛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后兄裂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體句旱,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年晰奖,在試婚紗的時候發(fā)現(xiàn)自己被綠了谈撒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡匾南,死狀恐怖啃匿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蛆楞,我是刑警寧澤立宜,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站臊岸,受9級特大地震影響橙数,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜帅戒,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一灯帮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧逻住,春花似錦钟哥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至扒秸,卻和暖如春播演,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伴奥。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工写烤, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拾徙。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓洲炊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子暂衡,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,647評論 2 354

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