一个类可以继承namedtuple的特性吗?

时间:2016-06-06 20:42:42

标签: python namedtuple

我有一个名为元组。

import collections

MyNamedTuple = collections.namedtuple('MyNamedTuple', 'prop1 prop2 foo bar')

我想定义一个可以通过这些命名元组初始化的类。

class MyClass():
    def __init__(self, t):
        self.prop1 = t.prop1
        self.prop2 = t.prop2
        self.foo = t.foo
        self.bar = t.bar

MyNamedTuple越大,定义MyClass所需的输入就越多,所以我很好奇是否有更有效的方法来定义MyClass

1 个答案:

答案 0 :(得分:2)

你有几个选项... namedtuple返回一个类 - 你可以直接对它进行子类化:

class MyClass(MyNamedTuple):
    ...

当然,这意味着MyClass tuple,这可能并不理想......

您还可以使用namedtuple的_fields属性(记录在案 - 前导下划线是为了防止属性名称冲突,而不是表明它是“私有”成员)...

def __init__(self, t):
    for field in t._fields:
        setattr(self, field, getattr(t, field))

当然,通过内省进行这种设置并不总是最清楚的事情(并且可能会引起虚假的催眠警告)​​......

否则,没有一种非常好的方法可以使短信很快拥有真正的短代码并将它们全部写出来可能是您最好的选择。如果将来对namedtuple中的字段数量预计会发生变化,我建议您进行单元测试,检查新创建的MyClassMyNamedTuple之间的对比。创建它以确保正在设置MyNamedTuple的所有属性。你可以(可能应该)使用_fields的内省进行检查。