Библиотека attrs Python меняет правила игры для разработчиков, стремящихся упростить создание классов и сократить количество шаблонного кода. Этой библиотеке доверяет даже НАСА.
Созданный Хайнеком Шлаваком в 2015 году, attrs быстро стал любимым инструментом среди разработчиков 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 value4. Расширенное использование
а. Настройка поведения атрибута:
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)5. Лучшие практики и распространенные ошибки
Лучшие практики:
Библиотека | Функции | Производительность | Сообщество |
---|---|---|---|
атрисы | Автоматическая генерация методов, определение атрибутов с типами и значениями по умолчанию, валидаторы и преобразователи | Более высокая производительность, чем при написании вручную | Активное сообщество |
пидантический | Проверка данных и управление настройками, автоматическая генерация методов, определение атрибутов с типами и значениями по умолчанию, валидаторы и преобразователи | Хорошее исполнение | Активное сообщество |
классы данных | Встроено в Python 3.7, что делает их более доступными | Привязано к версии Python | Встроенная библиотека Python |
attrs и классы данных работают быстрее, чем pydantic1.
Производительность:
attrs обычно обеспечивает более высокую производительность, чем написанные вручную классы или другие библиотеки, благодаря оптимизированной реализации.
Пример из реальной жизни:
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", "[email protected]") 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 — это мощная библиотека, которая упрощает определения классов Python, предоставляя при этом надежные функции для проверки и манипулирования данными. Его способность сокращать шаблонный код, улучшать читаемость и повышать производительность делает его бесценным инструментом для разработчиков Python.
Ресурсы сообщества:
Попробуйте attrs в своем следующем проекте и убедитесь в его преимуществах на собственном опыте. Поделитесь своим опытом с сообществом и внесите свой вклад в его постоянное развитие. Приятного кодирования!
https://stefan.sofa-rockers.org/2020/05/29/attrs-dataclasses-pydantic/ ↩
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3