python視頻教程欄目繼續帶大家了解Python數據結構的Namedtuple。
上篇Python數據結構:一個被低估的Namedtuple(一)講了namedtuple的一些基本用法,本篇繼續。
namedtuples和數據類(Data Class)之間有什么區別?
功能
在Python 3.7之前,可使用以下任一方法創建一個簡單的數據容器:
- namedtuple
- 常規類
- 第三方庫,
attrs
如果您想使用常規類,那意味著您將必須實現幾個方法。例如,常規類將需要一種__init__
方法來在類實例化期間設置屬性。如果您希望該類是可哈希的,則意味著自己實現一個__hash__
方法。為了比較不同的對象,還需要__eq__
實現一個方法。最后,為了簡化調試,您需要一種__repr__
方法。
讓我們使用常規類來實現下我們的顏色用例。
class Color: """A regular class that represents a color.""" def __init__(self, r, g, b, alpha=0.0): self.r = r self.g = g self.b = b self.alpha = alpha def __hash__(self): return hash((self.r, self.g, self.b, self.alpha)) def __repr__(self): return "{0}({1}, {2}, {3}, {4})".format( self.__class__.__name__, self.r, self.g, self.b, self.alpha ) def __eq__(self, other): if not isinstance(other, Color): return False return ( self.r == other.r and self.g == other.g and self.b == other.b and self.alpha == other.alpha )復制代碼
如上,你需要實現好多方法。您只需要一個容器來為您保存數據,而不必擔心分散注意力的細節。同樣,人們偏愛實現類的一個關鍵區別是常規類是可變的。
實際上,引入數據類(Data Class)
的PEP將它們稱為“具有默認值的可變namedtuple”(譯者注:Data Class python 3.7引入,參考:docs.python.org/zh-cn/3/lib…
現在,讓我們看看如何用數據類
來實現。
from dataclasses import dataclass ...@dataclassclass Color: """A regular class that represents a color.""" r: float g: float b: float alpha: float復制代碼
哇!就是這么簡單。由于沒有__init__
,您只需在docstring后面定義屬性即可。此外,必須使用類型提示對其進行注釋。
除了可變之外,數據類還可以開箱即用提供可選字段。假設我們的Color類不需要alpha字段。然后我們可以設置為可選。
from dataclasses import dataclassfrom typing import Optional ...@dataclassclass Color: """A regular class that represents a color.""" r: float g: float b: float alpha: Optional[float]復制代碼
我們可以像這樣實例化它:
>>> blue = Color(r=0, g=0, b=255)復制代碼
由于它們是可變的,因此我們可以更改所需的任何字段。我們可以像這樣實例化它:
>>> blue = Color(r=0, g=0, b=255) >>> blue.r = 1 >>> # 可以設置