我想我还没有考虑如何定义一个从namedtuple子类化的类:
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
Run Code Online (Sandbox Code Playgroud)
这段代码提出来了TypeError : __new__() takes exactly 4 arguments (2 given).
有什么想法吗?
实例构造函数(__new__)和实例初始化器(__init__)都需要接受相同数量的参数.
您__new__需要4个参数,但您的__init__方法只接受2.调整一个或另一个接受相同的数字,或*args在__init__方法中使用catch-all参数.
例如,使用以下__new__方法可以使事情有效:
def __new__(cls, a):
self = super(PDsub, cls).__new__(cls, a, a, a)
return self
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您不再需要你的__init__初始化所有.
演示:
>>> from collections import namedtuple
>>> PD = namedtuple('PD', 'x y z')
>>> class PDsub(PD):
... __slots__ = ()
... def __new__(cls, a):
... self = super(PDsub, cls).__new__(cls, a, a, a)
... return self
... def __str__(self):
... return 'Foo'
...
>>> p2 = PDsub(5)
>>> p2.x, p2.y, p2.z
(5, 5, 5)
>>> str(p2)
'Foo'
Run Code Online (Sandbox Code Playgroud)
一个不可变型等的元组经常使用__new__的构造,而不是的__init__初始化; 所有的内置immutables( ,frozenset,str)tuple这样做.
| 归档时间: |
|
| 查看次数: |
1198 次 |
| 最近记录: |