下面使用super()会引发一个类型错误:为什么?

>>> 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上也有类似的问题,错误的原因是User类不是新样式的类.但是,上面的类是一个新样式的类,因为它继承自object:

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

我错过了什么?我怎么用super(),这里?

HTMLParser.__init__(self)而不是super(TextParser, self).__init__()可以,但我想了解类型错误.

PS:Joachim指出,作为一个新样式的类实例并不等同于一个object.我读了很多次相反的内容,因此感到困惑(基于object实例测试的新型类实例测试示例:https://stackoverflow.com/revisions/2655651/3).

推荐答案

好的,这是通常的"super()不能和老式的类一起使用".

然而,重要的一点是,the correct test代表"这是一个新风格的instance(即物体)吗?"是

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

crucial point是旧样式的类,实例的classtype是不同的.这里,OldStyle().__class__OldStyle,不是从object继承的,而type(OldStyle())instance类型,does是从object继承的.基本上,旧样式的类只创建instance类型的对象(而新样式的类创建的对象的类型就是类本身).这可能就是实例OldStyle()object的原因:它的type()继承自object(它的类not继承自object这一事实并不重要:旧式类只构造instance类型的新对象).部分参考:https://stackoverflow.com/a/9699961/42973.

附言:新式课和老式课的区别也可以从以下几个方面看出:

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

(旧式类有not种类型,因此它们不能是其实例的类型).

Python相关问答推荐

隐藏QComboBox的指示器(qdarkstyle)

如何知道标志是否由用户传递或具有默认值?

使用Python Cerberus初始化一个循环数据 struct (例如树)(v1.3.5)

通过交换 node 对链接列表进行 Select 排序

Pythind 11无法弄清楚如何访问tuple元素

在Python中对分层父/子列表进行排序

大Pandas 胚胎中产生组合

numba jitClass,记录类型为字符串

Python中的嵌套Ruby哈希

可变参数数量的重载类型(args或kwargs)

将数据框架与导入的Excel文件一起使用

我们可以为Flask模型中的id字段主键设置默认uuid吗

如何设置视频语言时上传到YouTube与Python API客户端

我想一列Panadas的Rashrame,这是一个URL,我保存为CSV,可以直接点击

我的字符串搜索算法的平均时间复杂度和最坏时间复杂度是多少?

如何在Python中使用Pandas将R s Tukey s HSD表转换为相关矩阵''

Pandas:计算中间时间条目的总时间增量

pysnmp—lextudio使用next()和getCmd()生成器导致TypeError:tuple对象不是迭代器''

Odoo16:模板中使用的docs变量在哪里定义?

不允许 Select 北极滚动?