欢迎访问宙启技术站
智能推送

Python中的`@attr.s()`:快速创建具有属性的数据类。

发布时间:2023-12-27 05:45:14

在Python中,@attr.s()是一个装饰器函数,用于快速创建具有属性的数据类。它是attrs库提供的一个功能,该库可以让我们轻松定义不可变属性的类。使用@attr.s()装饰器可以减少大量的样板代码。

下面是一个简单的例子,说明如何使用@attr.s()创建一个数据类:

import attr

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

在上面的例子中,@attr.s()装饰器将Person类转化为一个具有属性的数据类。nameage是两个类属性,拥有对应的类型注解。这些属性默认会被转化为不可变的属性,即不能被修改。

使用@attr.s()装饰器后,会自动创建一些常见的方法,如__init____eq____repr__等。这些方法的实现使用了默认的方式,因此我们不需要手动编写它们。

下面是使用Person类的示例代码:

person = Person("John", 25)
print(person.name)  # 输出 "John"
print(person.age)  # 输出 25

# 不能修改不可变属性
person.name = "Mike"  # 抛出attr.exceptions.FrozenInstanceError异常
person.age = 30  # 抛出attr.exceptions.FrozenInstanceError异常

在上面的代码中,我们创建了一个Person对象,并访问了其属性。由于属性是不可变的,因此我们不能直接修改它们。如果尝试修改属性的值,会引发attr.exceptions.FrozenInstanceError异常。

@attr.s()装饰器还可以接受一些可选的参数,用于自定义类的行为。例如,可以使用kw_only=True参数强制类的属性只能通过关键字参数进行赋值。

@attr.s(kw_only=True)
class Point:
    x: int = attr.ib()
    y: int = attr.ib()

在上面的例子中,Point类的属性只能通过关键字参数进行赋值:

point = Point(x=1, y=2)
print(point.x, point.y)  # 输出 1 2

point = Point(1, 2)  # 抛出TypeError异常,必须使用关键字参数

attrs库还提供了其他许多功能,如属性验证、默认值、转换器等。我们可以在类属性中使用装饰器函数@attr.validators来指定属性验证器,使用default参数指定属性的默认值,使用convert参数指定属性的转换器等。

总结起来,@attr.s()是一个非常有用的装饰器,可以帮助我们快速创建具有属性的数据类。它减少了编写样板代码的工作量,让我们可以更专注于实现类的功能。同时,attrs库还提供了其他许多功能,可以进一步扩展数据类的功能。