>> from HTMLParser import HTMLParser >>> class TextParser(HTMLPars-6ren">
gpt4 book ai didi

python - super() 为新式类引发 "TypeError: must be type, not classobj"

转载 作者:IT老高 更新时间:2023-10-28 12:06:15 25 4
gpt4 key购买 nike

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。

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__OldStyle,不继承自object,而type(OldStyle()) code> 是 instance 类型,它确实 继承自 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

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

关于python - super() 为新式类引发 "TypeError: must be type, not classobj",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9698614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com