无法初始化名为dtup的子类的实例

2024-06-28 16:27:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我想我还没有理解如何从namedTuples定义类的子类:

from collections import namedtuple
PD = namedtuple('PD', 'x y z')
p1 = PD(0, 'u', 1)
print p1.x #<== this works

class PDsub(PD):
   __slots__ = ()
   def __new__(cls, x, y, z):
        self = super(PDsub, cls).__new__(cls, x, y, z)
        return self

   def __init__(self, a):
        self.x, self.y, self.z = a, a, a

   def __str__(self):
        return 'Foo'

p2 = PDsub(5) #<== this does not work

此代码引发TypeError : __new__() takes exactly 4 arguments (2 given)。在

有什么想法为什么?在


Tags: fromselfnewreturn定义defthis子类
2条回答
def __new__(cls, x, y, z):

p2 = PDsub(5)

无论何时为类创建对象,都会调用__new__方法(构造函数)来创建它。。因此,这里您的__new__方法需要4个参数,但是您只传递了2个参数(*注意:-parametercls是隐式的)

因此,您可以将您的__new__更改为采用2个参数,也可以将您的__init__改为采用4个参数,并相应地通过传递3个参数来创建your instance(第一个是隐式的)

实例构造函数(__new__)和实例初始值设定项(__init__)都需要接受相同数量的参数。在

您的__new__需要4个参数,但是您的__init__方法只接受2个参数。调整一个或另一个以接受相同的数字,或者在__init__方法中使用*argscatch all参数。在

例如,使用以下__new__方法可以使工作正常进行:

def __new__(cls, a):
    self = super(PDsub, cls).__new__(cls, a, a, a)
    return self

在这种情况下,您不再需要__init__初始值设定项。在

演示:

^{pr2}$

像元组这样的不可变类型通常使用__new__构造函数而不是__init__初始值设定项的;所有内置的不可变(frozensetstrtuple)都这样做。在

相关问题 更多 >