[英]Python Inheritance and __init__
我正在學習Python,我發現了一些關於Python如何構造一個令我困惑的子類的東西。
我有一個繼承自列表類的類,如下所示。
class foo(list):
def __init__(self, a_bar):
list.__init__([])
self.bar = a_bar
我知道list.__init__([])
需要在那里,但我對此感到困惑。 在我看來,這一行只會創建一個新的列表對象,然后將其分配給任何東西,所以我懷疑它只會被垃圾收集。 Python如何知道這個列表是我的對象的一部分? 我懷疑幕后發生了一些事情,我想知道它是什么。
這種多繼承安全的方法是:
class foo(list):
def __init__(self, a_bar):
super(foo, self).__init__()
...
這或許可以讓你更清楚你正在調用基類ctor。
通常在子類化和覆蓋__init__()
函數時執行此操作:
list.__init__(self)
如果您使用的是Python 3,則可以使用super()
:
super().__init__()
你是部分正確的:
list.__init__([])
“創建一個新的列表對象。” 但是這段代碼錯了。 正確的代碼_should_be:
list.__init__(self)
你需要它的原因有,因為你是從繼承list
有它自己的__init__()
方法來初始化自己的地方(大概)確實很重要。 當您定義自己的__init__()
方法時,您實際上會覆蓋同名的繼承方法。 為了確保父類的__init__()
代碼也被執行,您需要調用該父類的__init__()
。
有幾種方法可以做到這一點:
#explicitly calling the __init__() of a specific class
#"list"--in this case
list.__init__(self, *args, **kwargs)
#a little more flexible. If you change the parent class, this doesn't need to change
super(foo, self).__init__(*args, **kwargs)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.