簡體   English   中英

在python 2.7中調用超級子類

[英]calling super subclass in python 2.7

我正在嘗試了解python中的一些基本OOP。 如果我嘗試對諸如list之類的類進行子類化,該如何調用父構造函數? 修補了片刻之后,我發現它是:

super(subclass_name, self).__init__(args). 

但是我不直觀地理解這一點。 為什么我不能只列出(args)? 要么

list.__init__(args)? 

以下是相關代碼段:

class slist(list):
  def __init__(self, iterable):
    #super(slist, self).__init__(iterable)  <--- This works)
    list.__init__(iterable) # This does not work
    self.__l = list(iterable)

  def __str__(self):
    return ",".join([str(s) for s in self.__l])

list.__init__(iterable)缺少其中列出來初始化信息,並list(iterable)建立不同的名單完全無關你想初始化一個。

如果您不想使用super ,則可以執行list.__init__(self, iterable)

list.__init__(iterable)不正確。 您需要告訴__init__()它正在初始化哪個對象。 list(args)更不正確,因為它創建了一個全新的列表對象,而不是初始化您的對象。 它調用list.__new__()而不是list.__init__() 您需要將self傳遞給構造函數調用以正確初始化父類:

list.__init__(self, args)

那會起作用。 盡管通常使用super()可以使語法更簡潔。 例如,以上內容可以重寫為:

super(slist, self).__init__(args)

但是,鼓勵您使用super()而不是簡單地調用父構造函數,主要原因是您具有多個繼承。 super()將自動以正確的順序調用每個父類的構造函數。 這與Python的“ 方法解析順序”密切相關。

暫無
暫無

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

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