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

首頁 > 編程 > Python > 正文

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

2020-02-23 00:50:49
字體:
來源:轉載
供稿:網友

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

這時候就該 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__ 名字。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新田县| 浦城县| 肃北| 成都市| 顺义区| 深水埗区| 扶绥县| 正蓝旗| 福泉市| 阿坝| 鱼台县| 应用必备| 永嘉县| 竹溪县| 舒城县| 桦川县| 久治县| 额敏县| 彭山县| 兴安盟| 鄂伦春自治旗| 阿鲁科尔沁旗| 吉安市| 乐业县| 陇南市| 武川县| 德州市| 章丘市| 进贤县| 缙云县| 温州市| 镇赉县| 泌阳县| 广宗县| 芜湖县| 同江市| 保亭| 三穗县| 北辰区| 静海县| 板桥市|