是否可以创建一个继承自多个namedtuple
实例的类,或者创建类似的东西(具有将基本类型字段组合在一起的不可变类型)?我还没有找到这样做的方法。
下面的示例说明了问题:
>>> class Test(namedtuple('One', 'foo'), namedtuple('Two', 'bar')):
>>> pass
>>> t = Test(1, 2)
TypeError: __new__() takes 2 positional arguments but 3 were given
>>> t = Test(1)
>>> t.foo
1
>>> t.bar
1
问题似乎是由于
namedtuple
在创建时未使用super
来初始化其基类引起的,可以通过以下方式验证:>>> namedtuple('Test', ('field'), verbose=True)
[...]
class Test(tuple):
[...]
def __new__(_cls, field,):
'Create new instance of Test(field,)'
return _tuple.__new__(_cls, (field,))
即使我考虑编写自己版本的
namedtuple
来解决这个问题,但如何实现并不明显。如果一个类的MRO中有多个namedtuple
实例,则它们必须共享单个基类tuple
的实例。为了做到这一点,它们必须协调哪个namedtuple
使用基元组中的哪个索引范围。是否有更简单的方法来实现带有namedtuple
或类似物的多重继承?是否已经有人在某个地方实现了它?
namedtuple(Test, ('foo', 'bar'))
。 - Björn PollexTest.__init__
,因此只调用了第一个基类的__init__
函数,并且该函数仅接受一个(附加的)参数。 - chepner