【发布时间】:2015-03-09 11:38:46
【问题描述】:
是否可以创建一个继承自多个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'))。 -
问题是因为你没有定义
Test.__init__,所以只调用了first基类的__init__,而那个函数只需要一个(附加) 论点。
标签: python inheritance multiple-inheritance namedtuple