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




