亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> Python

Python Attrs:高级数据类,带有示例代码

Python Attrs 包允许您使用简单的注释创建高级数据类。当然,python 也有自己的原生数据类模块,但是 Python attrs 包提供了一些您可能喜欢的额外功能!

目录

<导航>

安装属性

attrs 包不是基础库的一部分,因此您需要使用 pip install 命令或类似的命令(如 Pipenv)安装它。您可能还想创建一个虚拟环境,这样它就不会干扰您拥有的其他项目。这个包叫做 attrs,所以安装它看起来像这样:

$ pip install attrs

# or with pipenv:
$ pipenv install attrs

属性与数据类

attrs 的作者 事实上,他曾致力于将数据类引入 Python 的 PEP。 Python 的原生数据类有意保持简单易懂,同时 attrs 提供了您可能想要的全部功能!

选择 Python 的一些原因 attrs 以上内置数据类有:

一个基本的 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)

几点观察:

接下来让我们看看这个包提供的相对于常规数据类的最重要的特性:验证器和转换器。

Python attrs 验证器示例

您可以通过两种方式向 attrs 数据类添加验证器:

  1. 使用装饰器
  2. 通过提供可调用函数

我将首先在这里演示可调用函数方法。 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

  1. Python 数据类型
  2. Python String strip() 函数与示例
  3. 带有示例的 Python 字符串计数()
  4. 带有示例的 Python round() 函数
  5. 带有示例的 Python map() 函数
  6. Python Timeit() 与示例
  7. 集合中的 Python 计数器示例
  8. Python time.sleep():为您的代码添加延迟(示例)
  9. 带有示例的 Python 列表计数()
  10. Python 列表 index() 与示例
  11. Python - 使用 C 进行扩展编程
  12. 利用分析改进先进制造的决策制定