上这堂课:
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))
有效,并且如果我A
从中继承set
,A(range(2))
也有效。
如果我将A的构造函数0或多个参数传递给A,则它应能正常工作(参数为0时将创建一个空集,参数为2或多个时将引发TypeError: A expected at most 1 arguments, got 2
)。
实际上,在子类化时需要重写__new__
方法(不是方法将接受由方法生成并返回的实例),以便从传递的iterable(作为参数)创建新的Frozenset:__init__
__init__
__new__
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'>,)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句