子类化集合namedtuple

子类化集合namedtuple,第1张

子类化集合namedtuple

新更新:

在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__
任何一个都不是必需的。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5649329.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存