Python 3.7 提供了新的 dataclasses
,它们具有预定义的特殊功能。
从总体上看,dataclasses
和 SimpleNamespace
都提供了很好的数据封装工具。
@dataclass
class MyData:
name:str
age: int
data_1 = MyData(name = 'JohnDoe' , age = 23)
data_2 = SimpleNamespace(name = 'JohnDoe' , age = 23)
很多时候我使用 SimpleNamespace
只是为了包装数据并移动它。
我什至将其子类化以添加特殊功能:
from types import SimpleNamespace
class NewSimpleNameSpace(SimpleNamespace):
def __hash__(self):
return some_hashing_func(self.__dict__)
对于我的问题:
- 人们如何在
SimpleNamespace
和dataclasses
之间进行选择? - 当扩展
SimpleNamespace
可以达到相同的效果时,为什么它们是必要的? - 所有其他用例
dataclasses
迎合什么?
最佳答案
Dataclasses 更像 namedtuple
和流行的 attrs包而不是 SimpleNamespace
(the PEP 中甚至没有提到)。它们有两种不同的预期目的。
数据类
- 结构化
- 键入(默认情况下,但可选)
- 为基本的 dunder 方法(
__init__
、__hash__
、__eq__
等)编写大部分样板文件 - 为属性的默认值提供简单的机制
- 可以轻松添加
__slots__
和方法
简单命名空间
- “抓包”数据结构
- 用于您需要的不仅仅是字典但不需要类的地方
- 不打算使用
__slots__
之类的东西
来自 SimpleNamespace
文档:
SimpleNamespace may be useful as a replacement for
class NS: pass
. However, for a structured record type usenamedtuple()
instead.
由于 @dataclass
应该替换 namedtuple
的很多用例,命名记录/结构应该用 @dataclass
来完成,而不是 SimpleNamespace
。
您可能还想查看 this PyCon talk by Raymond Hettinger ,在那里他进入了 @dataclass
的背景故事以及它的用途。
关于Python 3.7 : Utility of Dataclasses and SimpleNameSpace,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51082418/