日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python的super方法_Python中“super”是做什么的?

發(fā)布時(shí)間:2023/12/19 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python的super方法_Python中“super”是做什么的? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

有什么不同?SomeBaseClass.__init__(self)

意味著調(diào)用SomeBaseClass的__init__。而

super(Child, self).__init__()

意味著__init__從Child實(shí)例的方法解析順序中的父類調(diào)用一個(gè)綁定。

如果實(shí)例是Child的一個(gè)子類,則在方法解析順序中可能會(huì)有另一個(gè)父類。

Python 2與3

這在Python 2和3中工作:

super(Child, self).__init__()

這只適用于Python 3:

super().__init__()

它通過在堆棧框架中移動(dòng)并獲得方法的第一個(gè)參數(shù)(通常self用于實(shí)例方法或cls類方法 - 但可以是其他名稱)并Child在自由變量中找到類(例如,它在名稱中__class__作為一個(gè)自由的關(guān)閉變量在方法中查找)。

我傾向于演示使用交叉兼容的方式super,但是如果您只使用Python 3,則可以不帶參數(shù)地調(diào)用它。

具有向前兼容性的間接性

它給你什么?對(duì)于單一繼承,從靜態(tài)分析的角度來看,這個(gè)問題的例子實(shí)際上是相同的。但是,使用super向前兼容性給你一個(gè)間接層。

向前兼容對(duì)于經(jīng)驗(yàn)豐富的開發(fā)人員非常重要。您希望自己的代碼在更改時(shí)能夠保持最小的更改。當(dāng)你看你的修訂歷史,你想看看什么時(shí)候改變。

你可以從單一的繼承開始,但是如果你決定添加另一個(gè)基類,你只需要改變這個(gè)基礎(chǔ) - 如果基類在你繼承的類中改變(比如添加了一個(gè)mixin),你會(huì)改變這課沒有什么 特別是在Python 2中,將參數(shù)取得超級(jí)以及正確的方法參數(shù)是很困難的。如果你知道你正在使用super單一的繼承,這使得調(diào)試更困難的前進(jìn)。

依賴注入

其他人可以使用你的代碼,并將父母注入方法解析:

class SomeBaseClass(object):def __init__(self):print('SomeBaseClass.__init__(self) called')class UnsuperChild(SomeBaseClass):def __init__(self):print('UnsuperChild.__init__(self) called')SomeBaseClass.__init__(self)class SuperChild(SomeBaseClass):def __init__(self):print('SuperChild.__init__(self) called')super(SuperChild, self).__init__()

假設(shè)你添加了另一個(gè)類到你的對(duì)象,并且希望在Foo和Bar之間插入一個(gè)類(用于測(cè)試或其他原因):

class InjectMe(SomeBaseClass):def __init__(self):print('InjectMe.__init__(self) called')super(InjectMe, self).__init__()class UnsuperInjector(UnsuperChild, InjectMe): passclass SuperInjector(SuperChild, InjectMe): pass

使用un-super子程序?qū)o法注入依賴項(xiàng),因?yàn)槟谑褂玫淖禹?xiàng)對(duì)要調(diào)用的方法進(jìn)行硬編碼:

>>> o = UnsuperInjector()UnsuperChild.__init__(self) calledSomeBaseClass.__init__(self) called

但是,使用該子類的類super可以正確注入依賴關(guān)系:

>>> o2 = SuperInjector()SuperChild.__init__(self) calledInjectMe.__init__(self) calledSomeBaseClass.__init__(self) called

結(jié)論

始終用于super引用父類。

你打算引用下一個(gè)在線的父類,而不是專門看到孩子繼承的父類。

不使用super可以給你的代碼的用戶帶來不必要的限制。

總結(jié)

以上是生活随笔為你收集整理的python的super方法_Python中“super”是做什么的?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。