Python3.7:Dataclasses和SimpleName的实用程序

2024-09-27 07:21:56 发布

您现在位置:Python中文网/ 问答频道 /正文

Python3.7提供了新的dataclasses,它们具有预定义的特殊函数。在

总而言之,dataclasses和{}都提供了很好的数据封装工具。在

@dataclass
class MyData:
    name:str
    age: int

data_1 = MyData(name = 'JohnDoe' , age = 23)

data_2 = SimpleNameSpace(name = 'JohnDoe' , age = 23)

很多时候,我使用SimpleNameSpace来包装数据并移动它。在

我甚至将其子类化以添加特殊函数:

^{pr2}$

对于我的问题:

  1. 人们如何在SimpleNameSpacedataclasses之间进行选择?在
  2. 当扩展SimpleNameSpace可以达到同样的效果时,为什么它们是必要的?在
  3. 所有其他用例dataclasses迎合了什么?在

Tags: 工具数据函数nameagedataclassint
2条回答

简单的回答是,PEP 557涵盖了这一切。你的问题有点乱。。。在

为什么?

  1. 利用pep526提供一种简单的方法来定义这些类。在
  2. 支持静态类型检查程序。在

如何选择何时使用它们?

政治公众人物很清楚,他们不是替代者,并期望其他解决方案有自己的位置。在

与其他任何设计决策一样,您需要确切地决定您所关心的特性。如果这包括以下内容,那么您肯定不需要dataclasses。在

^{bq}$

也就是说,SimpleNameSpace也是如此,那么我们还可以看什么来决定呢?让我们仔细看看dataclasses提供的额外特性。。。在

SimpleNameSpace的现有定义如下:

A simple object subclass that provides attribute access to its namespace, as well as a meaningful repr.

python文档接着说它提供了一个简单的__init____repr__和{}实现。与PEP 557相比,dataclasses还提供了以下选项:

  • 排序-将类作为其字段的元组按顺序进行比较。在
  • 不变性-分配给字段将生成异常
  • 控制散列-尽管不建议这样做。在

显然,如果您关心排序或不变性(或者需要小生境散列控件),您应该使用dataclasses。在

其他用例?

我看不到,尽管你可以说,最初的“为什么?”涵盖其他用例。在

数据类更像namedtuple和流行的attrs包,而不是SimpleNamespace(在the PEP中甚至没有提到)。它们有两个不同的目的。在

数据类

  • 结构化
  • 类型化(默认情况下,但可选)
  • 编写基本dunder方法的大部分样板文件(__init____hash____eq__,等等)
  • 为属性的默认值提供简单的机制
  • 可以轻松添加__slots__和方法

SimpleNamespace

  • “抓包”数据结构
  • 当你需要一本字典而不是一个类时使用
  • 不打算使用__slots__

来自SimpleNamespace文档:

^{bq}$

由于@dataclass应该替换namedtuple的许多用例,命名记录/结构应该用@dataclass完成,而不是SimpleNamespace。在

您可能还想看看this PyCon talk by Raymond Hettinger,在这里他进入了@dataclass的背景知识和它的用法。在

相关问题 更多 >

    热门问题