【问题标题】:TypeError when calling superclass's __init__ method调用超类的 __init__ 方法时出现 TypeError
【发布时间】:2014-08-15 08:40:25
【问题描述】:

当我尝试创建一个类的实例时,不知何故遇到了一个奇怪的错误。

  ...
  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 module反汇编的两行代码

# 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__(obj1, *args, **kwargs) ?
  • 我无法重现该问题。请提供这样做的SSCCE
  • @martineau 我无法创建重现错误的 SSCCE。我找到了问题的根源,但错误本身对我来说仍然是一个绝对的谜。

标签: python python-2.7


【解决方案1】:

更改为super(SubClass, self).__init__(obj) 并没有解决问题,但确实将错误更改为:

TypeError: must be type, not None

Based on something I learned previously 导致此问题的更改是我试图做的一些(可能为时过早的)内存优化 - 从sys.modules 中删除模块。随之而来的是垃圾收集,SubClassSuperClass 的导入都变成了 None。将模块留在sys.modules 中可以消除问题。

虽然知道错误的原因并不能帮助我理解错误本身。我仍然不明白为什么我会收到TypeError: expected string or buffer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 2016-12-06
    • 2017-12-13
    • 1970-01-01
    • 2019-09-11
    相关资源
    最近更新 更多