python库(16):Attrs库创建具有属性的对象

python库(16):Attrs库创建具有属性的对象attrs库,即Attribute的缩写,是一个Python第三方库,它提供了一种优雅的方式来定义具有属性的类

1 Attrs简介

attrs库,即Attribute的缩写,是一个Python第三方库,它提供了一种优雅的方式来定义具有属性的类。使用attrs,你可以用更少的代码,更清晰的方式定义类和对象。

2 Attrs安装

pip install attrs -i https://pypi.tuna.tsinghua.edu.cn/simple

3 代码实例

3.1 基本使用

常规的对象创建如下:

class Person:
    name = None
    age = None
    def __init__(self,name,age):
        self.name = name
        self.age = age

# 创建一个Person对象
person = Person("Alice", 30)
print(person.name)  # 输出: Alice
print(person.age)   # 输出: 30

下面使用Attrs,我们使用了@attr.s装饰器来简化类的定义,attr.ib()用于定义类的属性。

import attr

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

person = Person("Alice", 30)
print(person.name)  # 输出: Alice
print(person.age)   # 输出: 30

3.2 属性验证

将age设置为int,赋值的时候给string类型

import attr
from attr.validators import instance_of

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

# 尝试创建一个年龄不是整数的Person对象
try:
    person = Person("Bob", "thirty")
except TypeError as e:
    print(e)

结果如下

attrs库不仅简化了类的创建,还提供了属性验证的功能。这意味着你可以在创建对象时确保属性值的有效性。

import attr


@attr.s
class TrafficLight:
    color = attr.ib(validator=attr.validators.in_({"red", "yellow", "green"}))


# 创建对象
traffic_light = TrafficLight(color="blue") # 会抛出 ValueError

以上是使用 attr.validators.in_() 可以限定属性值必须是特定集合中的一个。

3.3 可变和不可变属性

通过设置 frozen=True,可以创建不可变的实例:

import attr

@attr.s(frozen=True)
class ImmutablePerson:
    name = attr.ib()
    age = attr.ib()

immutable_person = ImmutablePerson("Carol", 25)
immutable_person.age = 26  # 这将引发TypeError

结果如下:

attrs库允许你定义可变和不可变属性。不可变属性意味着一旦对象被创建,其属性值就不能被改变。

3.4 自定义构造器

有时你可能需要自定义对象的构造过程。attrs提供了attrs工厂函数,允许你定义自己的构造器。

import attr


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

    def __attrs_post_init__(self):
        print(f"A new person has been created: {self.name}, {self.age}")

person = Person("Dave", 40)

结果如下:

3.5 比较

attrs库还提供了方便的方法来比较对象。例如,你可以轻松地比较两个对象是否相等。

import attr

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

person = Person("Eve", 28)
another_person = Person("Eve", 28)
print(person == another_person)

结果如下:

3.6 属性转换

attrs 还提供了属性转换器(converter)的功能,可以在属性赋值时进行自定义转换:

import attr


def convert_to_upper(value):
    return value.upper()


@attr.s
class Person:
    name = attr.ib(converter=convert_to_upper)


# 创建对象
person = Person(name="John")

# 输出对象信息
print(person.name)  # 输出 "JOHN"

在这个例子中,定义了一个转换器函数 convert_to_upper,用于将传入的字符串属性值转换为大写形式。通过将这个转换器函数应用于属性,可以在赋值时自动执行转换。

3.7 使用装饰器扩展功能

attrs 还支持使用装饰器扩展类的功能,例如,使用 @attr.s(slots=True) 可以启用 __slots__ 特性:

import attr

@attr.s(slots=True)
class Person:
    name = attr.ib()
    age = attr.ib()

这对于节省内存并提高属性访问速度很有帮助。

3.8 嵌套使用 attrs

attrs 还支持在一个类中嵌套使用另一个带有 @attr.s 装饰器的类。这使得构建复杂对象结构变得简单:

import attr

@attr.s
class Address:
    street = attr.ib()
    city = attr.ib()

@attr.s
class Person:
    name = attr.ib()
    age = attr.ib()
    address = attr.ib(factory=Address)

# 创建对象
person = Person(name="John", age=30, address={"street": "123 Main St", "city": "Anytown"})

# 输出对象信息
print(person)

结果如下:

在这个例子中,Person 类包含一个嵌套的 Address 类对象。通过使用 factory 参数,可以为 address 属性提供一个默认工厂函数,使得在创建 Person 对象时不必手动创建 Address 对象。

今天的文章 python库(16):Attrs库创建具有属性的对象分享到此就结束了,感谢您的阅读。
编程小号
上一篇 2024-10-19 10:46
下一篇 2024-10-19 10:30

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/4015.html