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

时间:2019-07-17 14:36:24

标签: 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))有效,如果我从A继承set,那么A(range(2))也有效。

如果我将0或多个参数传递给A的构造函数,它将按预期工作(使用0个参数将创建一个空集,使用2个或更多参数将引发TypeError: A expected at most 1 arguments, got 2)。

1 个答案:

答案 0 :(得分:3)

实际上,在子类化__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'>,)