小编典典

super() 为新型类引发“TypeError: must be type, not classobj”

all

以下使用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() raises
TypeError
,错误是由用户类不是新式类的事实来解释的。但是,上面的类是一个新式类,因为它继承自object

>>> isinstance(HTMLParser(), object)
True

我错过了什么?我如何使用super(), 在这里?

使用HTMLParser.__init__(self)代替super(TextParser, self).__init__()会起作用,但我想了解
TypeError。


阅读 129

收藏
2022-04-06

共1个答案

小编典典

好吧,这是通常的“super()不能与旧式类一起使用”。

然而,重要的一点是“这是一个新型 实例* (即对象)吗?” 的正确测试。*

>>> class OldStyle: pass
>>> instance = OldStyle()
>>> issubclass(instance.__class__, object)
False

而不是(如问题):

>>> isinstance(instance, object)
True

对于 classes ,正确的“这是一个新式类”测试是:

>>> 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())instance类型,它 继承
object。基本上,旧式类只创建类型instance的对象(而新式类创建类型为类本身的对象)。这可能就是为什么实例OldStyle()object:
它的type()继承自object(它的类不继承自的事实 不算object旧式类仅构造
类型的新对象instance)。

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

(旧式类 不是 类型,因此它们不能是其实例的类型)。

2022-04-06