我有一个名为元组。
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
。
答案 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中的字段数量预计会发生变化,我建议您进行单元测试,检查新创建的MyClass
与MyNamedTuple
之间的对比。创建它以确保正在设置MyNamedTuple
的所有属性。你可以(可能应该)使用_fields
的内省进行检查。