长话短说
PEP-557将数据类引入 Python 标准库,基本上可以扮演collections.namedtuple
和typing.NamedTuple
. 现在我想知道如何分离 namedtuple 仍然是更好的解决方案的用例。
数据类优于 NamedTuple
当然,dataclass
如果我们需要,所有功劳都归于:
- 可变对象
- 继承支持
property
装饰器,可管理的属性- 开箱即用的生成方法定义或可自定义的方法定义
数据类的优势在同一个 PEP 中进行了简要说明:Why not just use namedtuple。
问:在哪些情况下,namedtuple 仍然是更好的选择?
但是对于 namedtuples 有一个相反的问题怎么样:为什么不直接使用数据类呢?我猜从性能的角度来看,namedtuple 可能更好,但还没有发现任何确认。
例子
让我们考虑以下情况:
我们将把页面维度存储在一个带有静态定义字段、类型提示和命名访问的小容器中。不需要进一步的散列、比较等。
NamedTuple 方法:
from typing import NamedTuple
PageDimensions = NamedTuple("PageDimensions", [('width', int), ('height', int)])
数据类方法:
from dataclasses import dataclass
@dataclass
class PageDimensions:
width: int
height: int
哪种解决方案更可取,为什么?
PS这个问题无论如何都不是那个问题的重复,因为在这里我问的是namedtuple更好的情况,而不是区别(我在询问之前检查了文档和来源)