【问题标题】:Why this class constructor raises this error?为什么此类构造函数会引发此错误?
【发布时间】:2019-07-17 14:36:24
【问题描述】:

有这个类:

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 继承 AA(range(2)) 也有效。

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

【问题讨论】:

    标签: python class inheritance constructor frozenset


    【解决方案1】:

    其实在继承frozenset创建新的frozenset em> 来自传递的可迭代对象(作为参数):

    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'>,)
    

    【讨论】:

    • 为什么set 的行为不同?
    • __init__ 不创造价值;它初始化它被创建之后。集合是可变的,因此可以被初始化。冻结集是可变的,因此您需要将初始内容传递给实际的构造函数 (__new__),而不是初始值设定项。
    猜你喜欢
    • 1970-01-01
    • 2011-01-24
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 2013-08-07
    • 1970-01-01
    相关资源
    最近更新 更多