Python3里的super()和__class__使用介紹
子類里訪問(wèn)父類的同名屬性,而又不想直接引用父類的名字,因?yàn)檎f(shuō)不定什么時(shí)候會(huì)去修改它,所以數(shù)據(jù)還是只保留一份的好。其實(shí)呢,還有更好的理由不去直接引用父類的名字,參見(jiàn) 。
這時(shí)候就該 super() 登場(chǎng)啦——
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ù)的,所以得這么寫(xiě):
class B(A):
def m(self):
print('B')
super(B, self).m()
需要提到自己的名字。這個(gè)名字也是動(dòng)態(tài)查找的,在這種情況下替換第三方庫(kù)中的類會(huì)出問(wèn)題。
super() 很好地解決了訪問(wèn)父類中的方法的問(wèn)題。那么,如果要訪問(wèn)父類的父類(準(zhǔn)確地說(shuō),是方法解析順序(MRO)中位于第三的類)的屬性呢?
比如,B 類是繼承 A 的,它重寫(xiě)了 A 的 m 方法。現(xiàn)在我們需要一個(gè) C 類,它需要 B 類的一些方法,但是不要 B 的 m 方法,而改用 A 的。怎么間接地引用到 A 的 m 方法呢?使用self.__class__肯定是不行的,因?yàn)?C 還可能被進(jìn)一步繼承。
從文檔中我注意到,super 的實(shí)現(xiàn)是通過(guò)插入一個(gè)名為 __class__ 的名字來(lái)實(shí)現(xiàn)的(super 會(huì)從調(diào)用棧里去查找這個(gè) __class__ 名字)。所以,就像文檔里暗示的,其實(shí)可以直接在定義方法時(shí)訪問(wèn) __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()
會(huì)得到:
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
不過(guò),PyPy 并不支持這個(gè) __class__ 名字。
- 深入理解Python中的super()方法
- Python中的super()方法使用簡(jiǎn)介
- python類中super()和__init__()的區(qū)別
- Python 繼承,重寫(xiě),super()調(diào)用父類方法操作示例
- Python中super()函數(shù)簡(jiǎn)介及用法分享
- 解決python super()調(diào)用多重繼承函數(shù)的問(wèn)題
- python使用super()出現(xiàn)錯(cuò)誤解決辦法
- 詳解python的super()的作用和原理
- python類中super() 的使用解析
- Python中super()的理解以及應(yīng)用場(chǎng)景實(shí)例
相關(guān)文章
通過(guò)Python使用saltstack生成服務(wù)器資產(chǎn)清單
人工去對(duì)每一臺(tái)服務(wù)器的硬件信息并記錄早已經(jīng)過(guò)去了,無(wú)論通過(guò)腳本還是自動(dòng)化工具都是可以進(jìn)行一次編寫(xiě)到處抓取的,本文主要使用saltstack作為使用工具,然后利用其提供的APi編寫(xiě)所需的Python腳本2016-03-03以SQLite和PySqlite為例來(lái)學(xué)習(xí)Python DB API
本文將以SQLite和PySqlite為例來(lái)學(xué)習(xí)Python DB API,pysqlite是一個(gè)sqlite為python 提供的api接口,它讓一切對(duì)于sqlit的操作都變得異常簡(jiǎn)單2020-02-02Python實(shí)現(xiàn)完全數(shù)的示例詳解
完全數(shù),又稱完美數(shù),定義為:這個(gè)數(shù)的所有因數(shù)(不包括這個(gè)數(shù)本身)加起來(lái)剛好等于這個(gè)數(shù)。本文就來(lái)用Python實(shí)現(xiàn)計(jì)算完全數(shù),需要的可以參考一下2023-01-01python結(jié)合opencv實(shí)現(xiàn)人臉檢測(cè)與跟蹤
在Python下用起來(lái)OpenCV很爽,代碼很簡(jiǎn)潔,很清晰易懂。使用的是Haar特征的分類器,訓(xùn)練之后得到的數(shù)據(jù)存在一個(gè)xml中。下面我們就來(lái)詳細(xì)談?wù)劇?/div> 2015-06-06在Python的Flask框架中使用日期和時(shí)間的教程
這篇文章主要介紹了在Python的Flask框架中使用日期和時(shí)間的教程,包括對(duì)各個(gè)時(shí)區(qū)之間轉(zhuǎn)換的一些處理,需要的朋友可以參考下2015-04-04Python利用D3Blocks繪制可動(dòng)態(tài)交互的圖表
今天小編給大家來(lái)介紹一款十分好用的可視化模塊,D3Blocks,不僅可以用來(lái)繪制可動(dòng)態(tài)交互的圖表,并且導(dǎo)出的圖表可以是HTML格式,方便在瀏覽器上面呈現(xiàn),感興趣的可以了解一下2023-02-0210分鐘教你用python動(dòng)畫(huà)演示深度優(yōu)先算法搜尋逃出迷宮的路徑
這篇文章主要介紹了10分鐘教你用python動(dòng)畫(huà)演示深度優(yōu)先算法搜尋逃出迷宮的路徑,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08使用 Python 創(chuàng)建一個(gè)基于規(guī)則的聊天機(jī)器人
這篇文章主要介紹了使用 Python 創(chuàng)建一個(gè)基于規(guī)則的聊天機(jī)器人,使用 Python 創(chuàng)建一個(gè)簡(jiǎn)單的基于規(guī)則的聊天機(jī)器人 聊天機(jī)器人本身是一種機(jī)器或軟件,它通過(guò)文本或句子模仿人類交互。 簡(jiǎn)而言之,可以使用類似于與人類對(duì)話的軟件進(jìn)行聊天。2021-10-10最新評(píng)論