python的super方法_Python中“super”是做什么的?
有什么不同?SomeBaseClass.__init__(self)
意味著調用SomeBaseClass的__init__。而
super(Child, self).__init__()
意味著__init__從Child實例的方法解析順序中的父類調用一個綁定。
如果實例是Child的一個子類,則在方法解析順序中可能會有另一個父類。
Python 2與3
這在Python 2和3中工作:
super(Child, self).__init__()
這只適用于Python 3:
super().__init__()
它通過在堆棧框架中移動并獲得方法的第一個參數(通常self用于實例方法或cls類方法 - 但可以是其他名稱)并Child在自由變量中找到類(例如,它在名稱中__class__作為一個自由的關閉變量在方法中查找)。
我傾向于演示使用交叉兼容的方式super,但是如果您只使用Python 3,則可以不帶參數地調用它。
具有向前兼容性的間接性
它給你什么?對于單一繼承,從靜態分析的角度來看,這個問題的例子實際上是相同的。但是,使用super向前兼容性給你一個間接層。
向前兼容對于經驗豐富的開發人員非常重要。您希望自己的代碼在更改時能夠保持最小的更改。當你看你的修訂歷史,你想看看什么時候改變。
你可以從單一的繼承開始,但是如果你決定添加另一個基類,你只需要改變這個基礎 - 如果基類在你繼承的類中改變(比如添加了一個mixin),你會改變這課沒有什么 特別是在Python 2中,將參數取得超級以及正確的方法參數是很困難的。如果你知道你正在使用super單一的繼承,這使得調試更困難的前進。
依賴注入
其他人可以使用你的代碼,并將父母注入方法解析:
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__()
假設你添加了另一個類到你的對象,并且希望在Foo和Bar之間插入一個類(用于測試或其他原因):
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子程序將無法注入依賴項,因為您正在使用的子項對要調用的方法進行硬編碼:
>>> o = UnsuperInjector()UnsuperChild.__init__(self) calledSomeBaseClass.__init__(self) called
但是,使用該子類的類super可以正確注入依賴關系:
>>> o2 = SuperInjector()SuperChild.__init__(self) calledInjectMe.__init__(self) calledSomeBaseClass.__init__(self) called
結論
始終用于super引用父類。
你打算引用下一個在線的父類,而不是專門看到孩子繼承的父類。
不使用super可以給你的代碼的用戶帶來不必要的限制。
總結
以上是生活随笔為你收集整理的python的super方法_Python中“super”是做什么的?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS AutoLayout使用技巧
- 下一篇: 用 Python 语言来写游戏