上这门课:
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/