Python3里的super()和__class__使用介紹
子類里訪問父類的同名屬性,而又不想直接引用父類的名字,因為說不定什么時候會去修改它,所以數(shù)據(jù)還是只保留一份的好。其實呢,還有更好的理由不去直接引用父類的名字,參見 。
這時候就該 super() 登場啦——
class A:
def m(self):
print('A')
class B(A):
def m(self):
print('B')
super().m()
B().m()
當(dāng)然 Python 2 里 super() 是一定要參數(shù)的,所以得這么寫:
class B(A):
def m(self):
print('B')
super(B, self).m()
需要提到自己的名字。這個名字也是動態(tài)查找的,在這種情況下替換第三方庫中的類會出問題。
super() 很好地解決了訪問父類中的方法的問題。那么,如果要訪問父類的父類(準確地說,是方法解析順序(MRO)中位于第三的類)的屬性呢?
比如,B 類是繼承 A 的,它重寫了 A 的 m 方法。現(xiàn)在我們需要一個 C 類,它需要 B 類的一些方法,但是不要 B 的 m 方法,而改用 A 的。怎么間接地引用到 A 的 m 方法呢?使用self.__class__肯定是不行的,因為 C 還可能被進一步繼承。
從文檔中我注意到,super 的實現(xiàn)是通過插入一個名為 __class__ 的名字來實現(xiàn)的(super 會從調(diào)用棧里去查找這個 __class__ 名字)。所以,就像文檔里暗示的,其實可以直接在定義方法時訪問 __class__ 名字,它總是該方法被定義的類。繼續(xù)我們的單字母類:
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__ 名字。
相關(guān)文章
Django?ORM?事務(wù)和查詢優(yōu)化的操作方法
這篇文章主要介紹了Django?ORM?事務(wù)和查詢優(yōu)化,包括事務(wù)操作、ORM 惰性查詢及only與defer相關(guān)知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09
Pandas使用Merge與Join和Concat分別進行合并數(shù)據(jù)效率對比分析
這篇文章主要給大家介紹了關(guān)于pandas中DataFrame數(shù)據(jù)合并連接(merge、join、concat)的相關(guān)資料,文中介紹的非常詳細,需要的朋友可以參考下2022-12-12
Python?中?key?參數(shù)的含義及用法小結(jié)
我們在使用?sorted()?或?map()?函數(shù)的時候,都會看到里面有一個?key?參數(shù),其實這個?key?參數(shù)也存在于其他內(nèi)置函數(shù)中(例如?min()、max()?等),那么我們今天就來了解一下?key?參數(shù)的含義以及用途吧,需要的朋友可以參考下2023-12-12
Tensorflow加載預(yù)訓(xùn)練模型和保存模型的實例
今天小編就為大家分享一篇Tensorflow加載預(yù)訓(xùn)練模型和保存模型的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07

