对于新样式的类,super()引发“ TypeError:必须为类型,而不是classobj”
以下用法super()
引发TypeError:为什么?
>>> from HTMLParser import HTMLParser
>>> class TextParser(HTMLParser):
... def __init__(self):
... super(TextParser, self).__init__()
... self.all_data = []
...
>>> TextParser()
(...)
TypeError: must be type, not classobj
在StackOverflow上有一个类似的问题:Python
super()引发TypeError,该错误由用户类不是新型类的事实来解释。但是,上述类是一种新型类,因为它继承自object
:
>>> isinstance(HTMLParser(), object)
True
我想念什么?我如何super()
在这里使用?
使用HTMLParser.__init__(self)
代替super(TextParser,
self).__init__()
可以工作,但是我想了解TypeError。
PS:Joachim指出,成为一个新类实例并不等同于成为一个实例object
。我读了很多相反的书,因此感到困惑(基于object
实例测试的新型类实例测试的示例:https
:
//stackoverflow.com/revisions/2655651/3)。
-
好吧,这是通常的“
super()
不能与老式类一起使用”。但是,重要的一点是对“这是一个新的 实例* (即对象)吗?” 的正确测试 。是 *
>>> class OldStyle: pass >>> instance = OldStyle() >>> issubclass(instance.__class__, object) False
而不是(如问题所示):
>>> isinstance(instance, object) True
对于 类 ,正确的“这是新型类”测试是:
>>> issubclass(OldStyle, object) # OldStyle is not a new-style class False >>> issubclass(int, object) # int is a new-style class True
在 关键的一点 是,与老式类的 类 的实例和它的 类型 是不同的。在这里,
OldStyle().__class__
is
OldStyle
,它不继承自object
,而type(OldStyle())
isinstance
类型,它 确实
继承自object
。基本上,旧式类仅创建类型的对象instance
(而新式类将创建其类型为类本身的对象)。这大概就是为什么实例OldStyle()
是object
:其type()
从继承object
(事实上,它的类并
没有
继承object
不计数:老式类只是构建类型的新对象instance
)。部分参考:https://stackoverflow.com/a/9699961/42973。PS:新式类和旧式类之间的区别还可以通过以下方式看到:
>>> type(OldStyle) # OldStyle creates objects but is not itself a type classobj >>> isinstance(OldStyle, type) False >>> type(int) # A new-style class is a type type
(旧式类 不是 类型,因此它们不能是其实例的类型)。