新更新:
在python
3.6+中,您可以使用新的类型化语法并创建一个
typing.NamedTuple。新语法支持所有常规的python类创建功能(从3.6.1版开始提供文档字符串,多重继承,默认参数,方法等):
import typingclass Pokemon(MyMixin, typing.NamedTuple): """ Attributes ---------- name : str What do you call your Pokemon? type : str grass, rock, electric, etc. level : int Experience level [0, 100] """ name: str type: str level: int = 0 # 3.6.1 required for default args def method(self): # method work
对象不受此版本创建的类大多是相当于原来
collections.namedtuple,除了几个细节。
您还可以使用与旧命名元组相同的语法:
Pokemon = typing.NamedTuple('Pokemon', [('name', str), ('type', str), ('level', int)])
原始答案
简短答案:否,除非您使用的是Python
<3.5
在P3文档似乎很清楚,除非你需要添加计算字段(即,描述符)暗示,继承
namedtuple不被认为是规范的做法。这是因为您可以直接更新文档字符串(它们从3.5开始就可以写了!)。
子类化对于添加新的存储字段没有用。相反,只需从
_fields属性创建一个新的命名元组类型…可以通过直接分配
__doc__字段来自定义文档字符串…
更新:
现在,在最新版本的Python中,轻量级数据类还有其他两种引人入胜的可能性。
一种是
types.SimpleNamespace(Python
3.3及更高版本)。它的结构不像
namedtuple,但结构并非总是必需的。
需要注意的一件事
SimpleNamespace:默认情况下,在实例化类时需要显式指定字段名称。可以通过调用以下命令轻松解决此问题
super().__init__:
from types import SimpleNamespaceclass Pokemon(SimpleNamespace): """ Attributes ---------- name : str What do you call your Pokemon? type : str grass, rock, electric, etc. level : int Experience level [0, 100] """ __slots__ = ("name", "type", "level") # note that use of __init__ is optional def __init__(self, name, type, level): super().__init__(name=name, type=type, level=level)
另一个有趣的选项-自python
3.7起可用-是
dataclasses.dataclass(另请参阅PEP
557):
from dataclasses import dataclass@dataclassclass Pokemon: __slots__ = ("name", "type", "level") name: str # What do you call your Pokemon? type: str # grass, rock, electric, etc. level: int = 0 # Experience level [0, 100]
请注意,这两个建议在默认情况下都是可变的,而
__slots__任何一个都不是必需的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)