La bibliothèque attrs de Python change la donne pour les développeurs qui cherchent à simplifier la création de classes et à réduire le code passe-partout. Cette bibliothèque jouit même de la confiance de la NASA.
Créé par Hynek Schlawack en 2015, attrs est rapidement devenu un outil préféré parmi les développeurs Python pour sa capacité à générer automatiquement des méthodes spéciales et à fournir une manière propre et déclarative de définir des classes.
les classes de données sont une sorte de sous-ensemble d'attrs.
Pourquoi les attrs sont utiles :
Installation:
Pour commencer avec attrs, vous pouvez l'installer en utilisant pip :
pip install attrs
Utilisation de base :
Voici un exemple simple d'utilisation d'attrs pour définir une 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 génère automatiquement les méthodes init, repr et eq pour vos 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. Utilisation avancée
un. Personnalisation du comportement des attributs :
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. Instances et emplacements gelés :
@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. Fonctions d'usine et traitement post-init :
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. Meilleures pratiques et pièges courants
Meilleures pratiques :
Bibliothèque | Caractéristiques | Performance | Communauté |
---|---|---|---|
attrs | Génération automatique de méthodes, définition d'attributs avec types et valeurs par défaut, validateurs et convertisseurs | Meilleures performances que le code manuel | Communauté active |
pydantique | Validation des données et gestion des paramètres, génération automatique de méthodes, définition d'attributs avec types et valeurs par défaut, validateurs et convertisseurs | Bonnes performances | Communauté active |
classes de données | Construits à Python 3.7, les rendant plus accessibles | Lié à la version Python | Bibliothèque Python intégrée |
attrs et dataclasses sont plus rapides que pydantic1.
Performance:
attrs offre généralement de meilleures performances que les classes écrites manuellement ou d'autres bibliothèques en raison de ses implémentations optimisées.
Exemple concret :
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 est une bibliothèque puissante qui simplifie les définitions de classes Python tout en fournissant des fonctionnalités robustes pour la validation et la manipulation des données. Sa capacité à réduire le code passe-partout, à améliorer la lisibilité et à améliorer les performances en fait un outil inestimable pour les développeurs Python.
Ressources communautaires :
Essayez attrs dans votre prochain projet et découvrez ses avantages par vous-même. Partagez vos expériences avec la communauté et contribuez à son développement continu. Bon codage !
https://stefan.sofa-rockers.org/2020/05/29/attrs-dataclasses-pydantic/ ↩
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3