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 >>> # 可以设置