python - 为什么这个类的构造函数会引发这个错误?

标签 python class inheritance constructor frozenset

上这门课:

class A(frozenset):
    def __init__(self, *args):
        frozenset.__init__(self, *args)

执行A(range(2))会导致以下错误:

Traceback (most recent call last):
  File "<pyshell#65>", line 1, in <module>
    A(range(2))
  File "<pyshell#60>", line 3, in __init__
    frozenset.__init__(self, *args)
TypeError: object.__init__() takes no parameters

同时,frozenset(range(2)) 可以工作,如果我从 set 继承 A,则 A(range (2)) 也有效。

如果我向 A 的构造函数传递 0 个或超过 1 个参数,它会按预期工作(使用 0 个参数创建一个空集,使用 2 个或更多参数引发 TypeError: A预计最多 1 个参数,得到 2 )。

最佳答案

实际上你需要重写__new__方法(不是__init____init__方法将接受由__new__<生成并返回的实例 方法)当对 frozenset 进行子类化以从传递的可迭代对象(作为参数)创建新的 frozenset 时:

class A(frozenset):
    def __new__(cls, *args):
        self = super().__new__(cls, *args)
        return self


print(A(range(2)))
print(A(range(2)).__class__.__bases__)

示例输出:

A({0, 1})
(<class 'frozenset'>,)

关于python - 为什么这个类的构造函数会引发这个错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57078429/

相关文章:

python - socket.py : TypeError: a float is required 上的深度错误

python - Django - 将日期设置为日期输入值

python - 如何检查输入是否在矩阵的第一列内

java - 打印陷入无限循环的链表

java - 如何将 Java 类作为 CGI 脚本执行

Java继承和 Activity

python - 在GAE中使用python上传blob数据

android - 为什么我的资源在我的Android项目中突然无法解析?

c++ - 如何允许模板类构造函数根据基类型支持不同数量的参数?

c# - 具有来自继承子类型的自动 T 的基本泛型类