python的__new__方法

1. __new__ 和__init__方法的區(qū)別:

先看一個例子:

# -*- coding: utf-8 -*-

class Person(object):

    def __new__(cls, name, age):
        print '__new__ called.'
        return super(Person, cls).__new__(cls, name, age)

    def __init__(self, name, age):
        print '__init__ called.'
        self.name = name
        self.age = age

    def __str__(self):
        return '<Person: %s(%s)>' % (self.name, self.age)

if __name__ == '__main__':
    name = Person('xxx', 24)
    print name

當(dāng)實(shí)例化的時候坡椒,結(jié)果:

__new__ called.
__init__ called.
<Person: xxx(24)>

通過運(yùn)行這段代碼,我們可以看到,new方法的調(diào)用是發(fā)生在init之前的涯保。其實(shí)當(dāng) 你實(shí)例化一個類的時候,具體的執(zhí)行邏輯是這樣的:

1.p = Person(name, age)
2.首先執(zhí)行使用name和age參數(shù)來執(zhí)行Person類的new方法周伦,這個new方法會 返回Person類的一個實(shí)例(通常情況下是使用 super(Persion, cls).new(cls, … …) 這樣的方式)夕春,
3.然后利用這個實(shí)例來調(diào)用類的init方法,上一步里面new產(chǎn)生的實(shí)例也就是 init里面的的 self
所以专挪,initnew 最主要的區(qū)別在于:

1 .init 通常用于初始化一個新實(shí)例及志,控制這個初始化的過程,比如添加一些屬性寨腔, 做一些額外的操作速侈,發(fā)生在類實(shí)例被創(chuàng)建完以后。它是實(shí)例級別的方法迫卢。

  1. new 通常用于控制生成一個新實(shí)例的過程倚搬。它是類級別的方法。
  2. new至少要有一個參數(shù)cls乾蛤,代表要實(shí)例化的類每界,此參數(shù)在實(shí)例化時由Python解釋器自動提供
  3. new必須要有返回值捅僵,返回實(shí)例化出來的實(shí)例,這點(diǎn)在自己實(shí)現(xiàn)new時要特別注意眨层,可以return父類new出來的實(shí)例命咐,或者直接是object的new出來的實(shí)例
  4. 可以將類比作制造商,new方法就是前期的原材料購買環(huán)節(jié)谐岁,init方法就是在有原材料的基礎(chǔ)上醋奠,加工,初始化商品環(huán)節(jié)

2. 什么時候需要__new__

new方法主要是當(dāng)你繼承一些不可變的class時(比如int, str, tuple)伊佃, 提供給你一個自定義這些類的實(shí)例化過程的途徑窜司。還有就是實(shí)現(xiàn)自定義的metaclass。
具體我們可以用int來作為一個例子:
假如我們需要一個永遠(yuǎn)都是正數(shù)的整數(shù)類型:

class PositiveInteger(int):
    def __init__(self, value):
        super(PositiveInteger, self).__init__(self, abs(value))

i = PositiveInteger(-3)
print i

但運(yùn)行后會發(fā)現(xiàn)航揉,結(jié)果根本不是我們想的那樣塞祈,我們?nèi)稳坏玫搅?3。這是因?yàn)閷τ趇nt這種 不可變的對象帅涂,我們只有重載它的new方法才能起到自定義的作用
修改后的代碼:

class PositiveInteger(int):
    def __new__(cls, value):
        return super(PositiveInteger, cls).__new__(cls, abs(value))

i = PositiveInteger(-3)
print i

通過重載new方法议薪,我們實(shí)現(xiàn)了需要的功能。

3. 單例模式

python的單例模式


可關(guān)注我的個人公眾號媳友,不定時分享一些爬蟲案例和技巧


qrcode_for_gh_7dbef0ec6098_258.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末斯议,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子醇锚,更是在濱河造成了極大的恐慌哼御,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件焊唬,死亡現(xiàn)場離奇詭異恋昼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)赶促,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門液肌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鸥滨,你說我怎么就攤上這事嗦哆。” “怎么了爵赵?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵吝秕,是天一觀的道長泊脐。 經(jīng)常有香客問我空幻,道長,這世上最難降的妖魔是什么容客? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任秕铛,我火速辦了婚禮约郁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘但两。我一直安慰自己鬓梅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布谨湘。 她就那樣靜靜地躺著绽快,像睡著了一般。 火紅的嫁衣襯著肌膚如雪紧阔。 梳的紋絲不亂的頭發(fā)上坊罢,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機(jī)與錄音擅耽,去河邊找鬼活孩。 笑死,一個胖子當(dāng)著我的面吹牛乖仇,可吹牛的內(nèi)容都是我干的憾儒。 我是一名探鬼主播杨箭,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼唆貌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了隅肥?” 一聲冷哼從身側(cè)響起警儒,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤阳掐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后冷蚂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缭保,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年蝙茶,在試婚紗的時候發(fā)現(xiàn)自己被綠了艺骂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡隆夯,死狀恐怖钳恕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蹄衷,我是刑警寧澤忧额,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站愧口,受9級特大地震影響睦番,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一托嚣、第九天 我趴在偏房一處隱蔽的房頂上張望巩检。 院中可真熱鬧,春花似錦示启、人聲如沸兢哭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽迟螺。三九已至,卻和暖如春舍咖,著一層夾襖步出監(jiān)牢的瞬間煮仇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工谎仲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浙垫,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓郑诺,卻偏偏與公主長得像夹姥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子辙诞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

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

  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學(xué)習(xí)記錄文檔辙售,今天18年5月份再次想寫文章,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 2,732評論 2 9
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉飞涂,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,682評論 0 9
  • Scala與Java的關(guān)系 Scala與Java的關(guān)系是非常緊密的5┎俊! 因?yàn)镾cala是基于Java虛擬機(jī)较店,也就是...
    燈火gg閱讀 3,421評論 1 24
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法士八,類相關(guān)的語法,內(nèi)部類的語法梁呈,繼承相關(guān)的語法婚度,異常的語法,線程的語...
    子非魚_t_閱讀 31,587評論 18 399
  • 《劉潤商學(xué)院》9.20 排中律官卡,自相矛盾蝗茁,總會有一個是對的。排中律中的反證法‘’反射寻咒,歸謬哮翘,存真‘’,用來假設(shè)毛秘,來...
    臺一DDM路靜娟閱讀 568評論 0 0