欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Python中__new__與__init__方法的區(qū)別詳解

系統(tǒng) 1620 0

在python2.x中,從object繼承得來(lái)的類(lèi)稱(chēng)為新式類(lèi)(如class A(object))不從object繼承得來(lái)的類(lèi)稱(chēng)為經(jīng)典類(lèi)(如class A())

新式類(lèi)跟經(jīng)典類(lèi)的差別主要是以下幾點(diǎn):

  1. 新式類(lèi)對(duì)象可以直接通過(guò)__class__屬性獲取自身類(lèi)型:type

  2. 繼承搜索的順序發(fā)生了改變,經(jīng)典類(lèi)多繼承時(shí)屬性搜索順序: 先深入繼承樹(shù)左側(cè),再返回,開(kāi)始找右側(cè)(即深度優(yōu)先搜索);新式類(lèi)多繼承屬性搜索順序: 先水平搜索,然后再向上移動(dòng)

例子:

經(jīng)典類(lèi): 搜索順序是(D,B,A,C)

            
>>> class A: attr = 1
...
>>> class B(A): pass
...
>>> class C(A): attr = 2
...
>>> class D(B,C): pass
...
>>> x = D()
>>> x.attr
1

          

新式類(lèi)繼承搜索程序是寬度優(yōu)先

新式類(lèi):搜索順序是(D,B,C,A)

            
>>> class A(object): attr = 1
...
>>> class B(A): pass
...
>>> class C(A): attr = 2
...
>>> class D(B,C): pass
...
>>> x = D()
>>> x.attr
2

          

  3. 新式類(lèi)增加了__slots__內(nèi)置屬性, 可以把實(shí)例屬性的種類(lèi)鎖定到__slots__規(guī)定的范圍之中。

  4. 新式類(lèi)增加了__getattribute__方法

  5.新式類(lèi)內(nèi)置有__new__方法而經(jīng)典類(lèi)沒(méi)有__new__方法而只有__init__方法

注意:Python 2.x中默認(rèn)都是經(jīng)典類(lèi),只有顯式繼承了object才是新式類(lèi)

  ?? 而Python 3.x中默認(rèn)都是新式類(lèi)(也即object類(lèi)默認(rèn)是所有類(lèi)的祖先),不必顯式的繼承object(可以按照經(jīng)典類(lèi)的定義方式寫(xiě)一個(gè)經(jīng)典類(lèi)并分別在python2.x和3.x版本中使用dir函數(shù)檢驗(yàn)下。

例如:

            
class A():

      pass

    print(dir(A))


          

會(huì)發(fā)現(xiàn)在2.x下沒(méi)有__new__方法而3.x下有。

接下來(lái)說(shuō)下__new__方法和__init__的區(qū)別:

在python中創(chuàng)建類(lèi)的一個(gè)實(shí)例時(shí),如果該類(lèi)具有__new__方法,會(huì)先調(diào)用__new__方法,__new__方法接受當(dāng)前正在實(shí)例化的類(lèi)作為第一個(gè)參數(shù)(這個(gè)參數(shù)的類(lèi)型是type,這個(gè)類(lèi)型在c和python的交互編程中具有重要的角色,感興趣的可以搜下相關(guān)的資料),其返回值是本次創(chuàng)建產(chǎn)生的實(shí)例,也就是我們熟知的__init__方法中的第一個(gè)參數(shù)self。那么就會(huì)有一個(gè)問(wèn)題,這個(gè)實(shí)例怎么得到?

注意到有__new__方法的都是object類(lèi)的后代,因此如果我們自己想要改寫(xiě)__new__方法(注意不改寫(xiě)時(shí)在創(chuàng)建實(shí)例的時(shí)候使用的是父類(lèi)的__new__方法,如果父類(lèi)沒(méi)有則繼續(xù)上溯)可以通過(guò)調(diào)用object的__new__方法類(lèi)得到這個(gè)實(shí)例(這實(shí)際上也和python中的默認(rèn)機(jī)制基本一致),如:

            
class display(object):
  def __init__(self, *args, **kwargs):
    print("init")
  def __new__(cls, *args, **kwargs):
    print("new")
    print(type(cls))
    return object.__new__(cls, *args, **kwargs)  
a=display()

          

運(yùn)行上述代碼會(huì)得到如下輸出:

            
new


            
              

init


            
          

因此我們可以得到如下結(jié)論:

在實(shí)例創(chuàng)建過(guò)程中__new__方法先于__init__方法被調(diào)用,它的第一個(gè)參數(shù)類(lèi)型為type。

如果不需要其它特殊的處理,可以使用object的__new__方法來(lái)得到創(chuàng)建的實(shí)例(也即self)。

于是我們可以發(fā)現(xiàn),實(shí)際上可以使用其它類(lèi)的__new__方法類(lèi)得到這個(gè)實(shí)例,只要那個(gè)類(lèi)或其父類(lèi)或祖先有__new__方法。

            
class another(object):
  def __new__(cls,*args,**kwargs):
    print("newano")
    return object.__new__(cls, *args, **kwargs)  
class display(object):
  def __init__(self, *args, **kwargs):
    print("init")
  def __new__(cls, *args, **kwargs):
    print("newdis")
    print(type(cls))
    return another.__new__(cls, *args, **kwargs)  
a=display()

          

上面的輸出是:

            
newdis

            
              
newano
init

            
          

所有我們發(fā)現(xiàn)__new__和__init__就像這么一個(gè)關(guān)系,__init__提供生產(chǎn)的原料self(但并不保證這個(gè)原料來(lái)源正宗,像上面那樣它用的是另一個(gè)不相關(guān)的類(lèi)的__new__方法類(lèi)得到這個(gè)實(shí)例),而__init__就用__new__給的原料來(lái)完善這個(gè)對(duì)象(盡管它不知道這些原料是不是正宗的)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 特级一级毛片免费看 | 日韩第一区 | 天天爱天天做久久天天狠狼 | 色呦呦在线观看视频 | 美女久草 | 污污网站国产精品白丝袜 | 中文字幕在线观看视频一区 | 大香久久 | 午夜在线影院 | 草草视频在线观看 | 久久久精品免费观看 | 欧美日韩在线视频不卡一区二区三区 | 日韩a在线看免费观看视频 五月天激情视频在线观看 成人97在线观看免费高清 | 亚洲欧美在线播放 | 九九热国产精品视频 | 欧美成年 | 日本一区二区三区中文字幕 | 丁香婷婷久久久综合精品国产 | 久久久久成人精品 | 欧洲色吧 | av福利在线观看 | 91青青国产在线观看免费 | 亚洲国产中文字幕 | 国产精品冒白浆免费视频 | 久久大香香蕉国产免费网站 | 色人阁亚洲 | 天天操中文字幕 | 猫鼠游戏电影在线观看免费版 | 欧美一级片在线视频 | 日韩欧美在线免费观看视频 | 午夜不卡一区二区 | 久久久久久久一区二区 | 欧美激情在线精品一区二区 | 天天夜夜骑 | 激情丁香婷婷 | 欧美另类综合 | 亚洲欧美一级久久精品 | 亚洲国产三级 | 日韩精品在线播放 | 国产乱码一区二区三区 | 免费看黄色一级大片 |