簡體   English   中英

Python繼承和__init__

[英]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) 

有關super()更多信息,請參閱此問題 ,有關超級陷阱的指導,請參閱此文章

實際對象不是使用__init__創建的,而是使用__new__創建的。 __init__不是用於創建對象本身,而是用於初始化它 - 即添加屬性等。當__init__被調用時, __init__ __new__已被調用,因此在您的示例中,列表已經在您的代碼運行之前創建。 __init__不應返回任何內容,因為它應該“就地”初始化對象(通過改變它),因此它通過副作用起作用。 (參見上一個問題文檔 。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM