我有一个命名元组。
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
.
最佳答案
你有几个选项...namedtuple
返回一个类——你可以直接子类化它:
class MyClass(MyNamedTuple):
...
当然,这意味着 MyClass
是一个元组
,这可能并不理想......
您还可以使用_fields
nametuple 的属性(已记录 - 前导下划线是为了防止属性名称冲突,而不是表明它是“私有(private)”成员)...
def __init__(self, t):
for field in t._fields:
setattr(self, field, getattr(t, field))
当然,这种通过内省(introspection)进行的设置并不总是最容易阅读的内容(并且可能会导致虚假的 linter 警告)...
否则,没有一个真正好的方法可以让 linter 满意并且拥有非常短的代码,将它们全部写出来可能是您的最佳选择。如果预计命名元组中的字段数量将来会发生变化,我建议您进行一个单元测试,根据MyNamedTuple
检查新创建的MyClass
用于创建它的 code> 以确保设置了 MyNamedTuple
的所有属性。您可以(并且可能应该)使用_fields
的内省(introspection)来执行此检查。
关于python - 类可以继承namedtuple的属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37666557/