调用超类的__init__方法时出现TypeError

时间:2014-06-24 22:46:21

标签: python python-2.7

当我尝试创建类的实例时,我以某种方式得到了一个奇怪的错误。

  ...
  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)

并且我TypeError方法中获取__init__,但在我之前调用它时却没有。{以下是使用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__方法,但结果不同。这是怎么回事?

1 个答案:

答案 0 :(得分:0)

更改为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