📜  attr 模块 python (1)

📅  最后修改于: 2023-12-03 15:29:31.768000             🧑  作者: Mango

Python的attr模块介绍

Python的 attr 模块是一个强大的实用工具,用于自动化实例属性的创建和管理。它为我们提供了简洁、优雅和可读性强的属性定义方式,使得我们可以更加专注于业务逻辑的实现。

安装

在使用 attr 模块之前,我们需要先安装它。可以通过以下命令使用pip来安装:

pip install attrs
基本用法

在Python中,我们通常使用类来定义实例。对于每个属性,我们都需要手动添加getter和setter方法,这样不仅繁琐,而且难以维护。attr 模块通过帮助我们自动生成这些代码来简化这个过程。

为了使用 attr 模块,我们需要导入它并使用 @attr.s 装饰器来定义类。下面是一个例子:

import attr

@attr.s
class Person:
    name: str = attr.ib()
    age: int = attr.ib()

上面的代码定义了一个Person类,它有两个属性,一个是名字(name),一个是年龄(age)。使用 @attr.s 装饰器使得该类可以使用自动生成的getter和setter方法。

我们可以通过以下方式创建实例:

p = Person('David', 30)

现在我们可以像访问这个类的方法一样访问它的属性:

print(p.name)   # 输出 David
print(p.age)    # 输出 30
类型注释

我们发现在上面的代码中,我们使用 attr.ib() 来定义属性。这个方法默认使用类型注释来推断属性类型。在上面的例子中,我们使用了str和int类型注释。

我们也可以通过传递type参数来指定属性类型:

@attr.s
class Person:
    name: str = attr.ib()
    age = attr.ib(type=int)

在这个例子中,我们使用了类型注释来定义名字(name)属性的类型,同时使用了 type=int 来指定了年龄(age)属性的类型。

默认值

attr 模块也为我们提供了方便的默认值机制。例如,我们可以使用 default 参数来为属性设置默认值:

from datetime import datetime

@attr.s
class Person:
    name: str = attr.ib(default='Unknown')
    created_at: datetime = attr.ib(factory=datetime.now)

在这个例子中,如果Person实例没有提供名字,那么它将被设置为 'Unknown'。而对于创建时间(created_at)属性,它将使用 datetime.now 方法的工程值作为默认值。

可变性

默认情况下, attr 模块的属性都是不可变的。这与Python的特殊方法实现方式相一致,可以有效避免潜在的副作用。但是,如果真正需要更改属性值,我们可以在定义时添加 mutable=True 参数来将属性变为可变的。

例如,以下代码中,我们将内部属性名字列表(name_list)设置为可变:

@attr.s
class Person:
    name_list: list = attr.ib(factory=list, mutable=True)
比较

由于 attr 模块自动生成了我们使用的大部分代码,因此它也可以帮助我们管理相等性和顺序性比较。使用 cmp=False 参数可以禁用这些功能。而如果我们想自定义比较函数,也可以使用 eqorder 参数。

例如,以下代码定义了一个自定义比较函数来比较Person实例的年龄属性:

import attr

@attr.s(cmp=False, order=False, eq=False)
class Person:
    name: str = attr.ib()
    age: int = attr.ib()

    def __lt__(self, other):
        return self.age < other.age
总结

在本文中,我们学习了 attr 模块的基础知识。我们了解了如何安装 attr 模块、如何使用它来自动生成属性的getter和setter方法、如何使用类型注释、如何使用默认值、如何定义可变属性和如何自定义比较函数。 attr 模块使得Python实例的定义和管理变得更加简单和高效,让我们可以更加专注于业务逻辑的实现。