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
与用于 MyNamedTuple
的 MyNamedTuple
创建它以确保 MyNamedTuple
的所有属性都已设置。您可以(可能应该)使用来自_fields
的内省来做这个检查。
我有一个命名元组。
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
与用于 MyNamedTuple
的 MyNamedTuple
创建它以确保 MyNamedTuple
的所有属性都已设置。您可以(可能应该)使用来自_fields
的内省来做这个检查。