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 合作,為您用來建立應用程式的開源軟體包提供商業支援和維護。節省時間、降低風險並改善程式碼運作狀況,同時向您使用的確切軟體包的維護人員付費。