自从提出这个问题以来,dataclasses 模块已被提出并被 Python 接受。这个模块有很多与namedtuples 重叠的用例,但具有更多的灵活性和功能。特别是,当您想为可变字段指定默认值时,您可以指定工厂函数。
from typing import List
from dataclasses import dataclass, field
@dataclass
class Node:
val: str
left: List["Node"] = field(default_factory=list)
right: List["Node"] = field(default_factory=list)
在命名元组中,您指定各种字段的类型,因此在这种情况下,我必须填写一些空白并假设 val 将是一个字符串,而 left 和 right 都将是其他Node 对象的列表。
由于right 和left 是类定义中赋值的左侧,所以当我们初始化Node 对象时,它们是可选参数。此外,我们可以提供一个默认值,但我们提供了一个默认工厂,这是一个在我们初始化 Node 对象时使用 0 个参数调用的函数,而无需指定这些字段。
例如:
node_1 = Node('foo')
# Node(val='foo', left=[], right=[])
node_2 = Node('bar', left=[node_1])
# Node(val='bar', left=[Node(val='foo', left=[], right=[])], right=[])
node_3 = Node('baz')
# Node(val='baz', left=[], right=[])
node_4 = Node('quux', left=[node_2], right=[node_3])
# Node(val='quux', left=[Node(val='bar', left=[Node(val='foo', left=[], right=[])], right=[])], right=[Node(val='baz', left=[], right=[])])
就我个人而言,对于我需要的不仅仅是最薄的数据容器的任何应用程序,我发现自己在使用dataclasses 而不是namedtuples。