Python 的 attrs 库对于希望简化类创建并减少样板代码的开发人员来说是一个游戏规则改变者。这个库甚至受到 NASA 的信任。
attrs 由 Hynek Schlawack 于 2015 年创建,因其能够自动生成特殊方法并提供干净的声明式方式来定义类,而迅速成为 Python 开发人员最喜欢的工具。
数据类是属性的一种子集。
为什么 attrs 有用:
安装:
要开始使用 attrs,您可以使用 pip 安装它:
pip install attrs
基本用法:
这是一个如何使用 attrs 定义类的简单示例:
import attr @attr.s class Person: name = attr.ib() age = attr.ib() # Creating an instance person = Person("Alice", 30) print(person) # Person(name='Alice', age=30)
attrs 会自动为您的类生成 init、repr 和 eq 方法:
@attr.s class Book: title = attr.ib() author = attr.ib() year = attr.ib() book1 = Book("1984", "George Orwell", 1949) book2 = Book("1984", "George Orwell", 1949) print(book1) # Book(title='1984', author='George Orwell', year=1949) print(book1 == book2) # True
import attr from typing import List @attr.s class Library: name = attr.ib(type=str) books = attr.ib(type=List[str], default=attr.Factory(list)) capacity = attr.ib(type=int, default=1000) library = Library("City Library") print(library) # Library(name='City Library', books=[], capacity=1000)
import attr def must_be_positive(instance, attribute, value): if value <= 0: raise ValueError("Value must be positive") @attr.s class Product: name = attr.ib() price = attr.ib(converter=float, validator=[attr.validators.instance_of(float), must_be_positive]) product = Product("Book", "29.99") print(product) # Product(name='Book', price=29.99) try: Product("Invalid", -10) except ValueError as e: print(e) # Value must be positive
import attr @attr.s class User: username = attr.ib() _password = attr.ib(repr=False) # Exclude from repr @property def password(self): return self._password @password.setter def password(self, value): self._password = hash(value) # Simple hashing for demonstration user = User("alice", "secret123") print(user) # User(username='alice')
@attr.s(frozen=True) # slots=True is the default class Point: x = attr.ib() y = attr.ib() point = Point(1, 2) try: point.x = 3 # This will raise an AttributeError except AttributeError as e: print(e) # can't set attribute
import attr import uuid @attr.s class Order: id = attr.ib(factory=uuid.uuid4) items = attr.ib(factory=list) total = attr.ib(init=False) def __attrs_post_init__(self): self.total = sum(item.price for item in self.items) @attr.s class Item: name = attr.ib() price = attr.ib(type=float) order = Order(items=[Item("Book", 10.99), Item("Pen", 1.99)]) print(order) # Order(id=UUID('...'), items=[Item(name='Book', price=10.99), Item(name='Pen', price=1.99)], total=12.98)
Library | Features | Performance | Community |
---|---|---|---|
attrs | Automatic method generation, attribute definition with types and default values, validators and converters | Better performance than manual code | Active community |
pydantic | Data validation and settings management, automatic method generation, attribute definition with types and default values, validators and converters | Good performance | Active community |
dataclasses | Built into Python 3.7+, making them more accessible | Tied to the Python version | Built-in Python library |
attrs and dataclasses are faster than pydantic1.
Performance:
attrs generally offers better performance than manually written classes or other libraries due to its optimized implementations.
Real-world example:
from attr import define, Factory from typing import List, Optional @define class Customer: id: int name: str email: str orders: List['Order'] = Factory(list) @define class Order: id: int customer_id: int total: float items: List['OrderItem'] = Factory(list) @define class OrderItem: id: int order_id: int product_id: int quantity: int price: float @define class Product: id: int name: str price: float description: Optional[str] = None # Usage customer = Customer(1, "Alice", "alice@example.com") product = Product(1, "Book", 29.99, "A great book") order_item = OrderItem(1, 1, 1, 2, product.price) order = Order(1, customer.id, 59.98, [order_item]) customer.orders.append(order) print(customer)
attrs is a powerful library that simplifies Python class definitions while providing robust features for data validation and manipulation. Its ability to reduce boilerplate code, improve readability, and enhance performance makes it an invaluable tool for Python developers.
Community resources:
Try attrs in your next project and experience its benefits firsthand. Share your experiences with the community and contribute to its ongoing development. Happy coding!
https://stefan.sofa-rockers.org/2020/05/29/attrs-dataclasses-pydantic/ ↩
以上是为什么你应该更多地使用 attrs的详细内容。更多信息请关注PHP中文网其他相关文章!