我想我还没有理解如何从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)
。在
有什么想法为什么?在
无论何时为类创建对象,都会调用
__new__
方法(构造函数)来创建它。。因此,这里您的__new__
方法需要4个参数,但是您只传递了2个参数(*注意:-parametercls
是隐式的)因此,您可以将您的
__new__
更改为采用2个参数,也可以将您的__init__
改为采用4个参数,并相应地通过传递3个参数来创建your instance
(第一个是隐式的)实例构造函数(
__new__
)和实例初始值设定项(__init__
)都需要接受相同数量的参数。在您的
__new__
需要4个参数,但是您的__init__
方法只接受2个参数。调整一个或另一个以接受相同的数字,或者在__init__
方法中使用*args
catch all参数。在例如,使用以下
__new__
方法可以使工作正常进行:在这种情况下,您不再需要
__init__
初始值设定项。在演示:
^{pr2}$像元组这样的不可变类型通常使用
__new__
构造函数而不是__init__
初始值设定项的;所有内置的不可变(frozenset
,str
,tuple
)都这样做。在相关问题 更多 >
编程相关推荐