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()
當然 Python 2 里 super() 是一定要參數(shù)的,所以得這么寫:
class B(A):
def m(self):
print('B')
super(B, self).m()
需要提到自己的名字。這個名字也是動態(tài)查找的,在這種情況下替換第三方庫中的類會出問題。
super() 很好地解決了訪問父類中的方法的問題。那么,如果要訪問父類的父類(準確地說,是方法解析順序(MRO)中位于第三的類)的屬性呢?
比如,B 類是繼承 A 的,它重寫了 A 的 m 方法?,F(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)文章
通過Python使用saltstack生成服務(wù)器資產(chǎn)清單
人工去對每一臺服務(wù)器的硬件信息并記錄早已經(jīng)過去了,無論通過腳本還是自動化工具都是可以進行一次編寫到處抓取的,本文主要使用saltstack作為使用工具,然后利用其提供的APi編寫所需的Python腳本2016-03-03以SQLite和PySqlite為例來學習Python DB API
本文將以SQLite和PySqlite為例來學習Python DB API,pysqlite是一個sqlite為python 提供的api接口,它讓一切對于sqlit的操作都變得異常簡單2020-02-02python結(jié)合opencv實現(xiàn)人臉檢測與跟蹤
在Python下用起來OpenCV很爽,代碼很簡潔,很清晰易懂。使用的是Haar特征的分類器,訓練之后得到的數(shù)據(jù)存在一個xml中。下面我們就來詳細談?wù)劇?/div> 2015-06-06Python利用D3Blocks繪制可動態(tài)交互的圖表
今天小編給大家來介紹一款十分好用的可視化模塊,D3Blocks,不僅可以用來繪制可動態(tài)交互的圖表,并且導出的圖表可以是HTML格式,方便在瀏覽器上面呈現(xiàn),感興趣的可以了解一下2023-02-0210分鐘教你用python動畫演示深度優(yōu)先算法搜尋逃出迷宮的路徑
這篇文章主要介紹了10分鐘教你用python動畫演示深度優(yōu)先算法搜尋逃出迷宮的路徑,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-08-08使用 Python 創(chuàng)建一個基于規(guī)則的聊天機器人
這篇文章主要介紹了使用 Python 創(chuàng)建一個基于規(guī)則的聊天機器人,使用 Python 創(chuàng)建一個簡單的基于規(guī)則的聊天機器人 聊天機器人本身是一種機器或軟件,它通過文本或句子模仿人類交互。 簡而言之,可以使用類似于與人類對話的軟件進行聊天。2021-10-10最新評論