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库创建具有属性的对象分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/4015.html