【发布时间】: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