亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

Python中__new__與__init__方法的區別詳解

2020-01-04 19:17:08
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了Python中__new__與__init__方法的區別,是Python學習中的基礎知識,需要的朋友可以參考下

在python2.x中,從object繼承得來的類稱為新式類(如class A(object))不從object繼承得來的類稱為經典類(如class A())

新式類跟經典類的差別主要是以下幾點:

1. 新式類對象可以直接通過__class__屬性獲取自身類型:type

2. 繼承搜索的順序發生了改變,經典類多繼承時屬性搜索順序: 先深入繼承樹左側,再返回,開始找右側(即深度優先搜索);新式類多繼承屬性搜索順序: 先水平搜索,然后再向上移動

例子:

經典類: 搜索順序是(D,B,A,C)

 

 
  1. >>> class A: attr = 1 
  2. ... 
  3. >>> class B(A): pass 
  4. ... 
  5. >>> class C(A): attr = 2 
  6. ... 
  7. >>> class D(B,C): pass 
  8. ... 
  9. >>> x = D() 
  10. >>> x.attr 

新式類繼承搜索程序是寬度優先

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

 

 
  1. >>> class A(object): attr = 1 
  2. ... 
  3. >>> class B(A): pass 
  4. ... 
  5. >>> class C(A): attr = 2 
  6. ... 
  7. >>> class D(B,C): pass 
  8. ... 
  9. >>> x = D() 
  10. >>> x.attr 

3. 新式類增加了__slots__內置屬性, 可以把實例屬性的種類鎖定到__slots__規定的范圍之中。

4. 新式類增加了__getattribute__方法

5.新式類內置有__new__方法而經典類沒有__new__方法而只有__init__方法

注意:Python 2.x中默認都是經典類,只有顯式繼承了object才是新式類

而Python 3.x中默認都是新式類(也即object類默認是所有類的祖先),不必顯式的繼承object(可以按照經典類的定義方式寫一個經典類并分別在python2.x和3.x版本中使用dir函數檢驗下。

例如:

 

 
  1. class A(): 
  2.  
  3.       pass 
  4.  
  5.     print(dir(A)) 

會發現在2.x下沒有__new__方法而3.x下有。

接下來說下__new__方法和__init__的區別:

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

注意到有__new__方法的都是object類的后代,因此如果我們自己想要改寫__new__方法(注意不改寫時在創建實例的時候使用的是父類的__new__方法,如果父類沒有則繼續上溯)可以通過調用object的__new__方法類得到這個實例(這實際上也和python中的默認機制基本一致),如:

 

 
  1. class display(object): 
  2. def __init__(self, *args, **kwargs): 
  3. print("init"
  4. def __new__(cls, *args, **kwargs): 
  5. print("new"
  6. print(type(cls)) 
  7. return object.__new__(cls, *args, **kwargs)  
  8. a=display() 

運行上述代碼會得到如下輸出:

 

  1. new 
  2.  
  3. <class 'type'
  4.  
  5. init 

因此我們可以得到如下結論:

在實例創建過程中__new__方法先于__init__方法被調用,它的第一個參數類型為type。

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

于是我們可以發現,實際上可以使用其它類的__new__方法類得到這個實例,只要那個類或其父類或祖先有__new__方法。

 

 
  1. class another(object): 
  2. def __new__(cls,*args,**kwargs): 
  3. print("newano"
  4. return object.__new__(cls, *args, **kwargs)  
  5. class display(object): 
  6. def __init__(self, *args, **kwargs): 
  7. print("init"
  8. def __new__(cls, *args, **kwargs): 
  9. print("newdis"
  10. print(type(cls)) 
  11. return another.__new__(cls, *args, **kwargs)  
  12. a=display() 

上面的輸出是:

 

 
  1. newdis 
  2. <class 'type'
  3. newano 
  4. init 

所有我們發現__new__和__init__就像這么一個關系,__init__提供生產的原料self(但并不保證這個原料來源正宗,像上面那樣它用的是另一個不相關的類的__new__方法類得到這個實例),而__init__就用__new__給的原料來完善這個對象(盡管它不知道這些原料是不是正宗的)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲va欧美va国产综合久久| 欧美亚州一区二区三区| 亚洲日本欧美日韩高观看| 欧美诱惑福利视频| 搡老女人一区二区三区视频tv| 国产精品视频男人的天堂| 中文字幕欧美日韩在线| 欧美精品久久久久久久免费观看| 国产精品夜间视频香蕉| 欧美一级视频一区二区| 黄色精品一区二区| 日韩中文字在线| 97视频在线看| 91sao在线观看国产| 亚洲精品国产精品国自产在线| 国产午夜精品理论片a级探花| 九九九久久久久久| 久久久久国产精品一区| 久久免费国产视频| 亚洲成人av资源网| 少妇高潮久久久久久潘金莲| 亚洲国产小视频| 亚洲精品视频中文字幕| 国产亚洲精品成人av久久ww| 日韩电影第一页| 92国产精品视频| 隔壁老王国产在线精品| 91sao在线观看国产| 欧美精品做受xxx性少妇| 亚洲天堂av在线免费观看| 日韩av在线最新| 国产女人精品视频| 国产成人97精品免费看片| 91沈先生在线观看| 欧美在线一级va免费观看| 欧美国产视频日韩| 第一福利永久视频精品| 国模精品一区二区三区色天香| 久久久免费观看| 91超碰caoporn97人人| 亚洲午夜久久久影院| 亚洲毛片在线免费观看| 亚洲成人av片| 色午夜这里只有精品| 热久久免费国产视频| 在线免费观看羞羞视频一区二区| 精品国内亚洲在观看18黄| 亚洲色图15p| 精品精品国产国产自在线| 国产精品久久久久久久7电影| 5566日本婷婷色中文字幕97| 国产一区深夜福利| 欧美一区深夜视频| 日韩在线观看免费网站| 国产91在线播放| 国产精品久久久久久久av电影| 欧美孕妇毛茸茸xxxx| 亚洲视频在线看| 国产欧美精品xxxx另类| 久久天天躁狠狠躁夜夜躁2014| 久久这里只有精品99| 国产一区av在线| 国产噜噜噜噜噜久久久久久久久| 国产亚洲精品久久久久久牛牛| 久久精品国产96久久久香蕉| 成人精品在线视频| 爽爽爽爽爽爽爽成人免费观看| 欧美中文字幕在线播放| 富二代精品短视频| 国产亚洲欧美aaaa| 欧美富婆性猛交| 成人夜晚看av| 日韩中文字幕网站| 久久久久久亚洲精品不卡| 91久久国产婷婷一区二区| 亚洲国产精品va在线看黑人| 亚洲最大av在线| 久久久久国产精品免费网站| 91麻豆国产语对白在线观看| 欧美亚洲一区在线| 久久精品99久久香蕉国产色戒| 777777777亚洲妇女| 久久国产精品久久久久久| 欧美孕妇孕交黑巨大网站| 91系列在线观看| 欧美国产乱视频| 成人免费在线视频网址| 欧美性猛交xxxx黑人| 色999日韩欧美国产| 日本久久91av| 91po在线观看91精品国产性色| 欧美视频免费在线观看| 亚洲欧美日韩综合| 欧美国产日韩中文字幕在线| 欧美高清视频在线播放| 国内自拍欧美激情| 国产成人精品久久久| 国产精品亚洲片夜色在线| 欧美激情亚洲另类| 亚洲第一色在线| 亚洲男女性事视频| 亚洲激情第一页| 欧美有码在线观看视频| 欧美精品在线极品| 91午夜在线播放| 欧美丰满老妇厨房牲生活| 亚洲女人天堂成人av在线| 欧美激情视频一区二区三区不卡| 亚洲乱亚洲乱妇无码| 久久久久久国产精品久久| 国内外成人免费激情在线视频| 国产精品十八以下禁看| 成人免费视频在线观看超级碰| 日韩成人av网| 久久久久久久久久婷婷| 在线亚洲午夜片av大片| 久久久欧美一区二区| 一区二区三区www| 国产欧美日韩专区发布| 国产一区二区黑人欧美xxxx| 国产999精品视频| 国产视频自拍一区| 日韩av在线免费观看一区| 亚洲一区二区三区成人在线视频精品| 亚洲欧美精品一区二区| 亚洲一区中文字幕在线观看| 国产精品爽黄69| 狠狠色狠色综合曰曰| 欧美乱妇高清无乱码| 97精品伊人久久久大香线蕉| 一区二区三欧美| 国产美女高潮久久白浆| 亚洲成人在线视频播放| 亚洲欧美激情精品一区二区| 欧美视频在线观看免费网址| 一区二区三区无码高清视频| 国产亚洲欧美日韩一区二区| 亚洲国产美女久久久久| 最新91在线视频| 91精品国产乱码久久久久久久久| 亚洲第一页在线| 最近2019中文字幕一页二页| 久久久久久有精品国产| 日韩网站免费观看| 亚洲区在线播放| 欧美成人剧情片在线观看| 综合网中文字幕| 97人人做人人爱| 中文字幕日韩在线视频| 成人写真福利网| 国产精品无码专区在线观看| 久久久久北条麻妃免费看| www.日韩不卡电影av| 91国自产精品中文字幕亚洲| 欧美成人久久久| 欧美日韩国产限制| 久久香蕉国产线看观看网| 奇门遁甲1982国语版免费观看高清| 不卡在线观看电视剧完整版| 91黑丝在线观看| 精品少妇一区二区30p| 亚洲第一精品夜夜躁人人爽| 国产精品视频一区国模私拍| 海角国产乱辈乱精品视频|