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