簡體   English   中英

調用超類的__init__方法時發生TypeError

[英]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刪除模塊。 隨之而來的是垃圾回收, SubClassSuperClass的導入SuperClass變成了None 將模塊留在sys.modules消除此問題。

雖然知道錯誤的原因並不能幫助我理解錯誤本身。 我仍然不明白為什么我得到TypeError: expected string or buffer

暫無
暫無

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

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