簡體   English   中英

無法識別我的錯:它似乎在調用超類構造函數中

[英]Can't identify my fault: it seems to be somewhere in calling superclass constructor

我正在使用Python 3.2.5。

我的代碼:

class Observable:
    def __init__(self):
        self.observers = []
   ...

class View(Frame, Observable):

    def __init__(self, master=None):
        super().__init__(View, self)
    ...

堆棧跟蹤:

Traceback (most recent call last):
  File "C:\Python34\lib\tkinter\__init__.py", line 108, in _cnfmerge
    for k, v in c.items():
AttributeError: 'View' object has no attribute 'items'

您能幫我了解我在做什么錯嗎?

您應該只調用super().__init__() 沒有參數的Python 3“ magic” super()與舊的super(View, self)等效,因此您無需將它們作為參數傳遞。

通常, items()與字典一起使用。 您正在View對象上調用items()方法,根據您發布的代碼來看,該對象似乎未實現items() 沒有定義items()方法,也沒有將dict子類化。

而且,正如其他人已經指出的那樣,對super()的調用已中斷。 但是我認為即使您修復它,也會遇到問題。

似乎View應該繼承自Frame ,因為這是創建自定義Tkinter小部件的正常方法。 如果我沒有記錯的話,Python的MRO將使super().__init__調用Observable的構造函數。 但這可能會破壞Frame功能。 也許您應該重新考慮您的類設計,或者也嘗試顯式調用Frame構造函數。

您還應該有一條消息,內容如下

_cnfmerge:后備原因:foo

請檢查/發布此消息。 這可能會有所幫助。

您正在將View類和self引用傳遞給超類__init__構造函數。 似乎您混淆了對超級構造函數的兩個等效調用:

super().__init__()
super(View, self).__init__()

在這兩種情況下, __init__的參數都是適用於self.__init__() 這就是為什么您收到錯誤的原因。

有關如何調用更多信息super()請參閱用於Python庫參考super()

但是,您還有其他問題。

@@AndréLaszlo注意到,使用super().__init__帶來的問題不僅僅是View類中的那一行代碼。

根據有關使用super()文章 ,要在子類使用多重繼承時對方法調用使用super()進行重新排序,則必須滿足某些條件:

  • super()調用的方法必須存在
  • 調用者和被調用者需要具有匹配的參數簽名
  • 並且該方法的每次出現都需要使用super()

第一個條件很容易。 所有類都具有__init__ 第二個條件可能還不錯; 您顯示的所有構造函數都可以不帶參數地調用。

但是,您在發布的代碼中破壞了第三個條件: Observable.__init__()不會在其中調用super().__init__() 如果您確實想使用此技術,則應該添加。 (不要忘記,您可以選擇在設計中不使用super() -您始終可以顯式調用超類構造函數。)

Frame.__init__()呢? 它會調用super().__init__()嗎? 如果此代碼是不是你的控制之下,並利用它不“合作” super()在其構造,那么最安全的解決方案可能是創建一個適配器類Frame 確實包括一個super().__init__()請根據我之前鏈接的同一篇文章的“如何合並非合作類”一節進行調用。

暫無
暫無

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

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