A biblioteca attrs do Python é uma virada de jogo para desenvolvedores que buscam simplificar a criação de classes e reduzir o código clichê. Esta biblioteca tem a confiança até da NASA.
Criado por Hynek Schlawack em 2015, o attrs rapidamente se tornou uma ferramenta favorita entre os desenvolvedores Python por sua capacidade de gerar automaticamente métodos especiais e fornecer uma maneira limpa e declarativa de definir classes.
dataclasses é uma espécie de subconjunto de atributos.
Por que os atributos são úteis:
Instalação:
Para começar com attrs, você pode instalá-lo usando pip:
pip install attrs
Uso básico:
Aqui está um exemplo simples de como usar atributos para definir uma classe:
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 gera automaticamente os métodos init, repr e eq para suas classes:
@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. Uso avançado
um. Personalizando o comportamento do atributo:
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')b. Instâncias e slots congelados:
@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 attributec. Funções de fábrica e processamento pós-inicialização:
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. Melhores práticas e armadilhas comuns
Melhores práticas:
Biblioteca | Características | Desempenho | Comunidade |
---|---|---|---|
atributos | Geração automática de métodos, definição de atributos com tipos e valores padrão, validadores e conversores | Melhor desempenho do que código manual | Comunidade ativa |
pydântico | Validação de dados e gerenciamento de configurações, geração automática de métodos, definição de atributos com tipos e valores padrão, validadores e conversores | Bom desempenho | Comunidade ativa |
classes de dados | Incorporado ao Python 3.7, tornando-os mais acessíveis | Vinculado à versão Python | Biblioteca Python integrada |
attrs e dataclasses são mais rápidos que pydantic1.
Desempenho:
attrs geralmente oferece melhor desempenho do que classes escritas manualmente ou outras bibliotecas devido às suas implementações otimizadas.
Exemplo do mundo real:
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 é uma biblioteca poderosa que simplifica as definições de classe Python ao mesmo tempo que fornece recursos robustos para validação e manipulação de dados. Sua capacidade de reduzir código clichê, melhorar a legibilidade e melhorar o desempenho o torna uma ferramenta inestimável para desenvolvedores Python.
Recursos da comunidade:
Experimente o Attrs em seu próximo projeto e experimente seus benefícios em primeira mão. Compartilhe suas experiências com a comunidade e contribua para seu desenvolvimento contínuo. Boa codificação!
https://stefan.sofa-rockers.org/2020/05/29/attrs-dataclasses-pydantic/ ↩
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3