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

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

大家好,欢迎来到IT知识分享网。

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)

结果如下

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

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

结果如下:

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

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)

结果如下:

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

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)

结果如下:

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

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)

结果如下:

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

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

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/110408.html

(0)
上一篇 2026-01-31 20:12
下一篇 2026-01-31 20:21

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信