attrs是一个 Python 包,它将让您从实现对象协议(又名 dunder 方法)的苦差事中解放出来,重新找回编写类的乐趣。自 2020 年起就受到 NASA 的火星任务信赖!
它的主要目标是帮助您编写简洁且正确的软件,而不会减慢您的代码速度。
如果没有我们出色的赞助商, attrs就不可能实现。特别是那些在组织及更高级别慷慨支持我们的人:
请考虑加入他们,帮助attrs的维护更加可持续!
attrs为您提供了一个类装饰器和一种以声明方式定义该类的属性的方法:
>>> from attrs import asdict, define, make_class, Factory
>>> @ define
... class SomeClass :
... a_number: int = 42
... list_of_numbers: list[ int ] = Factory( list )
...
... def hard_math ( self , another_number ):
... return self .a_number + sum ( self .list_of_numbers) * another_number
>>> sc = SomeClass( 1 , [ 1 , 2 , 3 ])
>>> sc
SomeClass(a_number=1, list_of_numbers=[1, 2, 3])
>>> sc.hard_math( 3 )
19
>>> sc == SomeClass( 1 , [ 1 , 2 , 3 ])
True
>>> sc != SomeClass( 2 , [ 3 , 2 , 1 ])
True
>>> asdict(sc)
{'a_number': 1, 'list_of_numbers': [1, 2, 3]}
>>> SomeClass()
SomeClass(a_number=42, list_of_numbers=[])
>>> C = make_class( " C " , [ " a " , " b " ])
>>> C( " foo " , " bar " )
C(a='foo', b='bar')
声明属性后, attrs会为您提供:
__repr__
,无需一次又一次地编写枯燥的样板代码,也没有运行时性能损失。
此示例使用 20.1.0 版本中引入的attrs的现代 API 以及 21.3.0 版本中添加的attrs包导入名称。经典 API( @attr.s
、 attr.ib
以及它们的严肃业务别名)和attr
包导入名称将无限期保留。
查看On The Core API Names以获得深入的解释!
没问题!对于attrs来说,类型完全是可选的。只需将attrs.field()
分配给属性,而不是用类型注释它们:
from attrs import define , field
@ define
class SomeClass :
a_number = field ( default = 42 )
list_of_numbers = field ( factory = list )
实际上, attrs可能会让您想起dataclasses
(事实上, dataclasses
是attrs的后代)。在实践中它可以做更多的事情并且更加灵活。例如,它允许您定义 NumPy 数组的特殊处理以进行相等性检查,允许更多方法插入初始化过程,替代__init_subclass__
,并允许使用调试器单步执行生成的方法。
欲了解更多详细信息,请参阅我们的比较页面,但一般来说,我们更有可能犯下违反自然的罪行,以使事情按照人们期望的方式进行,但在实践中相当复杂。
python-attrs
标签作为 Tidelift 订阅的一部分提供。
attrs和数千个其他软件包的维护者正在与 Tidelift 合作,为您用来构建应用程序的开源软件包提供商业支持和维护。节省时间、降低风险并改善代码运行状况,同时向您使用的确切软件包的维护人员付费。