[英]Python 3.7: Utility of Dataclasses and SimpleNameSpace
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
選擇? SimpleNameSpace
可以實現相同的效果? dataclasses
適合什么? 數據類更像是多少namedtuple
和流行的attrs包比SimpleNamespace
(其中甚至沒有提到的PEP )。 它們有兩種不同的用途。
數據類
__init__
, __hash__
, __eq__
,等等) __slots__
和方法 SimpleNamespace
__slots__
東西 從SimpleNamespace
文檔:
SimpleNamespace可以用作
class NS: pass
的替代class NS: pass
。 但是,對於結構化記錄類型,請使用namedtuple()
。
由於@dataclass
應該更換了很多的用例namedtuple
,命名為記錄/結構應該與做@dataclass
,不SimpleNamespace
。
您可能還想看看Raymond Hettinger的這個PyCon演講 ,在那里他進入了@dataclass
的背景故事並且它正在使用。
簡短的回答是PEP 557全部涵蓋了這一點。 稍微提問你的問題......
PEP非常清楚它們不是替代品,並期望其他解決方案有自己的位置。
與任何其他設計決策一樣,您需要確切地確定您關心的功能。 如果包含以下內容,您絕對不需要數據類。
哪里不適合使用數據類?
需要API與元組或dicts的兼容性。 需要超出PEP 484和526提供的類型驗證,或者需要進行值驗證或轉換。
也就是說,SimpleNameSpace也是如此,那么我們還能看到什么呢? 讓我們仔細看看數據類提供的額外功能......
SimpleNameSpace的現有定義如下:
一個簡單的對象子類,提供對其命名空間的屬性訪問,以及有意義的repr。
然后python文檔繼續說它提供了一個簡單的__init__
, __init__
__repr__
和__eq__
實現。 與PEP 557相比,數據類還為您提供以下選項:
顯然,如果您關心訂購或不可變性(或需要利基散列控制),您應該使用數據類。
沒有我能看到的,雖然你可以說最初的“為什么?” 涵蓋其他用例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.