python 3.7提供了新的dataclasses具有预定义的特殊功能。
从概述的角度来看,dataclassesSimpleNameSpace都提供了很好的数据封装功能。

@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__)

对于我的问题:
有人如何在SimpleNameSpacedataclasses之间进行选择?
为什么它们是必要的,当扩展SimpleNameSpace可以达到相同的效果时?
所有其他用例都是什么样的?

最佳答案

简短的回答是,这都包含在PEP 557中。你的问题有点乱…
为什么?
利用PEP 526提供定义此类类的简单方法。
以支持静态类型检查程序。
如何选择何时使用它们?
政治公众人物很清楚,他们不是替代者,希望其他解决方案有自己的位置。
像其他设计决策一样,因此您需要确切地决定您关心的特性。如果其中包括以下内容,则绝对不需要数据类。
哪里不适合使用数据类?
需要与元组或dict兼容的API。
需要超出PEPS 484和526提供的类型验证,或需要值验证或转换。
也就是说,simplenamespace也是如此,那么我们还可以看什么来决定呢?让我们仔细看看数据类提供的额外功能…
simpleNamespace的现有定义如下:
一个简单的对象子类,提供对其名称空间的属性访问,以及一个有意义的repr。
然后,python文档继续说,它提供了一个简单的实现。与PEP 557相比,数据类还为您提供了以下选项:
排序-按顺序将类作为其字段的元组进行比较。
不可变性-分配给字段将生成异常
控制哈希-尽管不建议这样做。
显然,如果您关心排序或不可变(或者需要特定的哈希控制),那么应该使用数据类。
其他用例?
我看不到,不过你可以争辩说最初的“为什么?”涵盖其他用例。

关于python - Python 3.7:Dataclasses和SimpleNameSpace的实用程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51082418/

10-12 21:47