class 可以继承 namedtuple 的属性吗?

Can a class inherit the properies of a namedtuple?

我有一个命名元组。

import collections

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

我想定义一个 class 可以由这些命名元组初始化。

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 returns a class -- 你可以直接子class它:

class MyClass(MyNamedTuple):
    ...

当然,这意味着 MyClass 一个 tuple 这可能是不可取的...

您还可以使用 namedtuple 的 _fields 属性(已记录——前导下划线是为了防止 属性 名称冲突,而不是表明它是 "private"会员)...

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

当然,这种通过内省进行的设置并不总是最清晰的阅读方式(并且可能会导致虚假的 linter 警告)...

否则,没有真正让 linters 满意的好方法 的代码非常短,将它们全部写出来可能是您的最佳选择。如果 namedtuple 中的字段数预计将来会发生变化,我建议您进行单元测试,以检查新创建的 MyClass 与用于 MyNamedTupleMyNamedTuple创建它以确保 MyNamedTuple 的所有属性都已设置。您可以(可能应该)使用来自_fields的内省来做这个检查。