调用超类的__init__方法时发生TypeError

罗伯·沃茨

在尝试创建类的实例时,我莫名其妙地收到了一个奇怪的错误。

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

# 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变成了None将模块保留在其中可以sys.modules消除该问题。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

调用超类的__init__方法时发生TypeError

来自分类Dev

在__init__调用中使用self.tr时,“从未调用%S的超类__init __()的RuntimeError”

来自分类Dev

在__init__调用中使用self.tr时,“从未调用%S的超类__init __()的RuntimeError”

来自分类Dev

模拟超类__init__方法或超类作为整体进行测试

来自分类Dev

正确的类时__new__不调用__init__

来自分类Dev

正确的类时__new__不调用__init__

来自分类常见问题

如何从子类调用基类的__init__方法?

来自分类Dev

覆盖ModelForm的__init__时发生NameError

来自分类Dev

python类的__init__方法

来自分类Dev

从超类调用方法

来自分类Dev

从超类调用方法

来自分类Dev

禁止调用父类的 __init__()

来自分类Dev

从超类的超类调用方法

来自分类Dev

TypeError:调用类方法时不是函数

来自分类Dev

TypeError:调用类方法时不是函数

来自分类Dev

抽象类错误“未从基类调用__init__方法”

来自分类Dev

Python:从__init__函数中调用类变量和类方法

来自分类Dev

在Python中动态创建类后如何调用父类的__init__方法?

来自分类Dev

创建实例时默认调用__init__

来自分类Dev

Mockito在存根时从超类调用真实方法

来自分类Dev

在调用方法时获取扩展超类的子类实例

来自分类Dev

调用超类构造函数和方法时的异常处理

来自分类Dev

在调用方法时获取扩展超类的子类实例

来自分类Dev

当对象调用其超类的方法时如何处理?

来自分类Dev

当子类调用超类的方法时,如何获得超类来引用子类中的属性?

来自分类Dev

为什么在翻到超类时__new__和__init__的行为似乎有所不同?

来自分类Dev

Django[ TypeError: __init__() got an unexpected keyword argument 'choice' ] 在我的模型中添加选择时发生

来自分类Dev

从其他类调用方法时发生NullPointerException

来自分类Dev

调用类方法时发生错误java.lang.NullPointerException

Related 相关文章

  1. 1

    调用超类的__init__方法时发生TypeError

  2. 2

    在__init__调用中使用self.tr时,“从未调用%S的超类__init __()的RuntimeError”

  3. 3

    在__init__调用中使用self.tr时,“从未调用%S的超类__init __()的RuntimeError”

  4. 4

    模拟超类__init__方法或超类作为整体进行测试

  5. 5

    正确的类时__new__不调用__init__

  6. 6

    正确的类时__new__不调用__init__

  7. 7

    如何从子类调用基类的__init__方法?

  8. 8

    覆盖ModelForm的__init__时发生NameError

  9. 9

    python类的__init__方法

  10. 10

    从超类调用方法

  11. 11

    从超类调用方法

  12. 12

    禁止调用父类的 __init__()

  13. 13

    从超类的超类调用方法

  14. 14

    TypeError:调用类方法时不是函数

  15. 15

    TypeError:调用类方法时不是函数

  16. 16

    抽象类错误“未从基类调用__init__方法”

  17. 17

    Python:从__init__函数中调用类变量和类方法

  18. 18

    在Python中动态创建类后如何调用父类的__init__方法?

  19. 19

    创建实例时默认调用__init__

  20. 20

    Mockito在存根时从超类调用真实方法

  21. 21

    在调用方法时获取扩展超类的子类实例

  22. 22

    调用超类构造函数和方法时的异常处理

  23. 23

    在调用方法时获取扩展超类的子类实例

  24. 24

    当对象调用其超类的方法时如何处理?

  25. 25

    当子类调用超类的方法时,如何获得超类来引用子类中的属性?

  26. 26

    为什么在翻到超类时__new__和__init__的行为似乎有所不同?

  27. 27

    Django[ TypeError: __init__() got an unexpected keyword argument 'choice' ] 在我的模型中添加选择时发生

  28. 28

    从其他类调用方法时发生NullPointerException

  29. 29

    调用类方法时发生错误java.lang.NullPointerException

热门标签

归档