Python Attrs:高级数据类,带有示例代码
Python Attrs 包允许您使用简单的注释创建高级数据类。当然,python 也有自己的原生数据类模块,但是 Python attrs 包提供了一些您可能喜欢的额外功能!
目录
<导航>- 安装属性
- 属性与数据类
- 一个基本的 Python attrs 示例
- Python attrs 验证器示例
- Python attrs 转换器示例
- 在 Python attrs 中使用槽
- 继续学习
安装属性
attrs 包不是基础库的一部分,因此您需要使用 pip install 命令或类似的命令(如 Pipenv)安装它。您可能还想创建一个虚拟环境,这样它就不会干扰您拥有的其他项目。这个包叫做 attrs,所以安装它看起来像这样:
$ pip install attrs # or with pipenv: $ pipenv install attrs
属性与数据类
attrs
的作者 事实上,他曾致力于将数据类引入 Python 的 PEP。 Python 的原生数据类有意保持简单易懂,同时 attrs 提供了您可能想要的全部功能!
选择 Python 的一些原因 attrs
以上内置数据类有:
- 您使用的是 3.7 之前的 Python 版本。 Attrs 为您提供支持,因为它支持所有主流 Python 版本,包括 CPython 2.7 和 PyPy。
- 您想要更多功能:attrs 提供验证器和转换器
- 您希望使用 attrs slotted 类获得最佳性能和最小内存使用量
一个基本的 Python attrs 示例
我们先来看一个很基础的例子:
import attr @attr.s class Person(object): name = attr.ib(default='John') surname = attr.ib(default='Doe') age = attr.ib(init=False) p = Person() print(p) p = Person('Bill', 'Gates') p.age = 60 print(p) # Output: # Person(name='John', surname='Doe', age=NOTHING) # Person(name='Bill', surname='Gates', age=60)
几点观察:
- 语法不如数据类优雅且冗长,但作为回报,您可以获得额外的功能。
- 与数据类类似,当您打印数据时,您会获得格式良好的数据表示。
- attrs 包使用精心挑选的名称,例如
attr.ib
, 所以你只需要导入 attr.或者,您可以导入全名。例如from attr import attrib, attrs
, 并改用这些名称。功能是一样的。
接下来让我们看看这个包提供的相对于常规数据类的最重要的特性:验证器和转换器。
Python attrs 验证器示例
您可以通过两种方式向 attrs 数据类添加验证器:
- 使用装饰器
- 通过提供可调用函数
我将首先在这里演示可调用函数方法。 Attrs 提供了几个开箱即用的验证器,我们将使用其中的 instance_of
以下示例中的验证器:
>>> @attr.s ... class C(object): ... x = attr.ib(validator=attr.validators.instance_of(int)) >>> C(42) C(x=42) >>> C("a string") Traceback (most recent call last): ... TypeError: ("'x' must be <type 'int'> (got 'a string' that is a <type 'str'>).", ...
由于我们尝试使用 x 的字符串值创建对象 C,因此 instance_of 验证器会抛出错误,因为它需要 int 类型而不是字符串。
现在让我们定义自己的验证器:
import attr @attr.s class DividableByTwo(object): x = attr.ib() @x.validator def check(self, attribute, value): if value % 2 != 0: raise ValueError(f'{value} is not dividable by 2') print (DividableByTwo(60)) print (DividableByTwo(11)) # Output will be something like: # DividableByTwo(x=60) # ... # ValueError: 11 is not dividable by 2
Python attrs 转换器示例
转换器采用设置的值并自动转换它。您可以将其用于各种目的。一个示例是自动将值转换为 int。同样,让我们从使用可调用函数开始,在这种情况下,我们只需使用 Python 的 int() 函数:
import attr @attr.s class C(object): x = attr.ib(converter=int) c = C("1") print(c) # Output: # C(x=1)
我们的输入(字符串“1”)被自动转换为整数。由于转换器在验证器之前运行,因此您可以在转换后验证最终值。例如,你可以来上面两个例子,先将任意输入转换为int,然后检查该值是否可以被2整除。
在 Python 属性中使用槽
最后,您可以告诉 attrs 使用时隙类。 Slotted 类比常规类有一些优势:
- 它们的内存占用很小
- 他们更快
简而言之,使用开槽类,您可以明确声明您希望对象实例具有哪些实例属性。这样,Python 可以省去一些检查等,从而减少内存使用并略微提高速度。您可以在此处的 attrs 文档中找到更多详细信息。
但是,插槽类也有一些注意事项,尤其是在您手动创建它们时。幸运的是,attrs 为我们提供了一种启用该功能的简单方法:
import attr @attr.s(slots=True) class YourClassName: ...
不断学习
- 我们关于 Python 数据类的文章
- 我们关于 Python 类和对象的教程
- 有关更多示例,请查看 attrs 示例页面
Python