长话短说
PEP-557在Python标准库中引入了数据类,基本上可以扮演与collections.namedtuple和typing.NamedTuple相同的角色。现在我想知道如何分离namedtuple仍然是更好的解决方案的用例。
数据类优于NamedTuple
当然,如果我们需要,所有的功劳都归于数据类:
可变的对象 继承的支持 属性装饰器,可管理的属性 生成开箱即用的方法定义或可定制的方法定义
在同一个PEP中简要解释了数据类的优点:为什么不直接使用namedtuple。
问:在哪些情况下namedtuple仍然是一个更好的选择?
但是对于命名元组,另一个相反的问题是:为什么不直接使用数据类呢? 我猜namedtuple可能从性能的角度更好,但还没有找到证实。
例子
让我们考虑以下情况:
我们将使用静态定义的字段、类型提示和命名访问将页面维度存储在一个小容器中。不需要进一步的哈希、比较等等。
NamedTuple方法:
from typing import NamedTuple
PageDimensions = NamedTuple("PageDimensions", [('width', int), ('height', int)])
DataClass方法:
from dataclasses import dataclass
@dataclass
class PageDimensions:
width: int
height: int
哪种解决方案更可取,为什么?
P.S.这个问题在任何方面都不是那个问题的副本,因为在这里我问的是namedtuple更好的情况,而不是关于差异(在问之前我已经检查了文档和源代码)