国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

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

2020-02-23 01:03:14
字體:
來源:轉載
供稿:網友

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

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

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

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

例子:

經典類: 搜索順序是(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.attr1

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

新式類:搜索順序是(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.attr2

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

  4. 新式類增加了__getattribute__方法

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

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

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

例如:

class A():      pass    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中的默認機制基本一致),如:

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()            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 千阳县| 名山县| 防城港市| 资源县| 大安市| 凤城市| 寻甸| 大方县| 喀喇沁旗| 宁远县| 鄢陵县| 金沙县| 福鼎市| 嵩明县| 苍山县| 灌南县| 大同市| 丰都县| 保定市| 溧水县| 永州市| 延安市| 新民市| 获嘉县| 胶南市| 陆川县| 临沭县| 长泰县| 许昌市| 时尚| 长春市| 建昌县| 大渡口区| 天峨县| 淳安县| 内黄县| 阜阳市| 江西省| 铜陵市| 张掖市| 建宁县|