子類里訪問父類的同名屬性,而又不想直接引用父類的名字,因為說不定什么時候會去修改它,所以數據還是只保留一份的好。其實呢,還有更好的理由不去直接引用父類的名字,參見 。
這時候就該 super() 登場啦――
class B(A):
def m(self):
print('B')
super().m()
B().m()
super() 很好地解決了訪問父類中的方法的問題。那么,如果要訪問父類的父類(準確地說,是方法解析順序(MRO)中位于第三的類)的屬性呢?
比如,B 類是繼承 A 的,它重寫了 A 的 m 方法。現在我們需要一個 C 類,它需要 B 類的一些方法,但是不要 B 的 m 方法,而改用 A 的。怎么間接地引用到 A 的 m 方法呢?使用self.__class__肯定是不行的,因為 C 還可能被進一步繼承。
從文檔中我注意到,super 的實現是通過插入一個名為 __class__ 的名字來實現的(super 會從調用棧里去查找這個 __class__ 名字)。所以,就像文檔里暗示的,其實可以直接在定義方法時訪問 __class__ 名字,它總是該方法被定義的類。繼續我們的單字母類:
class D(C):
def m(self):
print('D')
super().m()
o = D()
o.m()
新聞熱點
疑難解答
圖片精選