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

首頁 > 編程 > Python > 正文

Python3里的super()和__class__使用介紹

2019-11-25 17:40:52
字體:
來源:轉載
供稿:網友

子類里訪問父類的同名屬性,而又不想直接引用父類的名字,因為說不定什么時候會去修改它,所以數據還是只保留一份的好。其實呢,還有更好的理由不去直接引用父類的名字,參見

這時候就該 super() 登場啦――

復制代碼 代碼如下:

class A:
  def m(self):
    print('A')

class B(A):
  def m(self):
    print('B')
    super().m()

B().m()


當然 Python 2 里 super() 是一定要參數的,所以得這么寫:
復制代碼 代碼如下:

class B(A):
  def m(self):
    print('B')
    super(B, self).m()

需要提到自己的名字。這個名字也是動態查找的,在這種情況下替換第三方庫中的類會出問題。

super() 很好地解決了訪問父類中的方法的問題。那么,如果要訪問父類的父類(準確地說,是方法解析順序(MRO)中位于第三的類)的屬性呢?

比如,B 類是繼承 A 的,它重寫了 A 的 m 方法。現在我們需要一個 C 類,它需要 B 類的一些方法,但是不要 B 的 m 方法,而改用 A 的。怎么間接地引用到 A 的 m 方法呢?使用self.__class__肯定是不行的,因為 C 還可能被進一步繼承。

從文檔中我注意到,super 的實現是通過插入一個名為 __class__ 的名字來實現的(super 會從調用棧里去查找這個 __class__ 名字)。所以,就像文檔里暗示的,其實可以直接在定義方法時訪問 __class__ 名字,它總是該方法被定義的類。繼續我們的單字母類:

復制代碼 代碼如下:

class C(B):
  def m(self):
    print('C')
    # see the difference!
    print(__class__.__mro__)
    print(self.__class__.__mro__)
    __class__.__mro__[2].m(self)

class D(C):
  def m(self):
    print('D')
    super().m()

o = D()
o.m()


會得到:
復制代碼 代碼如下:

D
C
(<class 't.C'>, <class 't.B'>, <class 't.A'>, <class 'object'>)
(<class 't.D'>, <class 't.C'>, <class 't.B'>, <class 't.A'>, <class 'object'>)
A

不過,PyPy 并不支持這個 __class__ 名字。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 绿春县| 萨迦县| 嘉禾县| 婺源县| 白朗县| 桃江县| 东方市| 商洛市| 乐安县| 舞阳县| 龙口市| 潢川县| 隆尧县| 城步| 绥阳县| 莱州市| 宝鸡市| 兴和县| 张掖市| 阿鲁科尔沁旗| 普格县| 彩票| 陇南市| 泗洪县| 合肥市| 寿宁县| 安义县| 营口市| 木里| 新源县| 都兰县| 策勒县| 大姚县| 兰西县| 绥阳县| 且末县| 巨鹿县| 元阳县| 宜黄县| 六安市| 米脂县|