[英]TypeError when calling superclass's __init__ method
嘗試創建類的實例時,出現某種奇怪的錯誤。
...
File <file1>, line 242, in some_method
created_object = SubClass(obj1, obj2)
File <file2>, line 11, in __init__
SuperClass.__init__(self, obj1)
TypeError: expected string or buffer
這是兩個__init__
方法的樣子:
class SubClass(SuperClass):
def __init__(self, obj1=None, obj2=None):
SuperClass.__init__(self, obj1)
...
和
class SuperClass(object):
def __init__(self, obj1=None, obj2=None):
self.obj1 = obj1
創建子類實例的“ file1”中的相同代碼也將創建同一超類的其他子類的實例。 它們都接收類似的對象作為參數,但是只有一個子類引起此錯誤。 此外,至少一個工作子類的__init__
方法具有完全相同的定義和第一行。
在“ file1”中進行了一些更改之后,最近才出現此錯誤,但是我沒有觸及實例化子類對象或傳遞給它們的對象的方式。
無論如何,我根本不理解錯誤。 什么期望一個字符串或緩沖區,為什么?
任何人都可以闡明這個錯誤嗎?
編輯:
self.SubClass = getattr(importlib.import_module(subclass_module), 'SubClass')
del sys.modules[subclass_module] # Premature optimization strikes again!
如我發布的答案中所述,我發現以上是導致此錯誤發生的原因。 但是,一點點挖掘使我對錯誤本身更加困惑。 我將__init__
方法更改為此:
def __init__(self, obj1=None, obj2=None):
print None.__init__
None.__init__('Hello', 'World')
並這樣稱呼它:
print None.__init__
None.__init__('Hello', 'World')
obj = self.SubClass(obj1, obj2)
並且我仍然在__init__
方法中收到TypeError
, 但是在我之前調用它時卻沒有 。 這是使用dis
模塊拆卸的兩行
# None.__init__('Hello', 'World') in SubClass.__init__
10 9 LOAD_CONST 0 (None)
12 LOAD_ATTR 1 (__init__)
15 LOAD_CONST 1 ('Hello')
18 LOAD_CONST 2 ('World')
21 CALL_FUNCTION 2
24 POP_TOP
# None.__init__('Hello', 'World') right before I try to create the SubClass object
246 147 LOAD_CONST 0 (None)
150 LOAD_ATTR 7 (__init__)
153 LOAD_CONST 5 ('Hello')
156 LOAD_CONST 6 ('World')
159 CALL_FUNCTION 2
162 POP_TOP
我放入的兩張照片的輸出是這樣的:
<method-wrapper '__init__' of NoneType object at 0x102977538>
<method-wrapper '__init__' of NoneType object at 0x102977538>
因此,每次使用常量調用時都是相同的__init__
方法,但結果不同。 這里發生了什么?
更改為super(SubClass, self).__init__(obj)
不能解決問題,但確實將錯誤更改為此:
TypeError: must be type, not None
根據我先前了解到的信息,導致此問題的更改是我嘗試執行的(可能為時過早的)內存優化-從sys.modules
刪除模塊。 隨之而來的是垃圾回收, SubClass
和SuperClass
的導入SuperClass
變成了None
。 將模塊留在sys.modules
消除此問題。
雖然知道錯誤的原因並不能幫助我理解錯誤本身。 我仍然不明白為什么我得到TypeError: expected string or buffer
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.