Pythons attrs-Bibliothek ist ein Game-Changer für Entwickler, die die Klassenerstellung vereinfachen und Boilerplate-Code reduzieren möchten. Dieser Bibliothek vertraut sogar die NASA.
Attrs wurde 2015 von Hynek Schlawack entwickelt und hat sich aufgrund seiner Fähigkeit, automatisch spezielle Methoden zu generieren und eine saubere, deklarative Möglichkeit zum Definieren von Klassen bereitzustellen, schnell zu einem beliebten Tool unter Python-Entwicklern entwickelt.
Datenklassen sind eine Art Teilmenge von Attributen.
Warum Attrs nützlich sind:
Installation:
Um mit attrs zu beginnen, können Sie es mit pip:
installieren.
pip install attrs
Grundlegende Verwendung:
Hier ist ein einfaches Beispiel für die Verwendung von Attrs zum Definieren einer Klasse:
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 generiert automatisch die Methoden init, repr und eq für Ihre Klassen:
@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. Erweiterte Nutzung
A. Anpassen des Attributverhaltens:
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. Eingefrorene Instanzen und Slots:
@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. Werksfunktionen und Post-Init-Verarbeitung:
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. Best Practices und häufige Fallstricke
Best Practices:
Bibliothek | Merkmale | Leistung | Gemeinschaft |
---|---|---|---|
attrs | Automatische Methodengenerierung, Attributdefinition mit Typen und Standardwerten, Validatoren und Konverter | Bessere Leistung als manueller Code | Aktive Community |
pydantisch | Datenvalidierung und Einstellungsverwaltung, automatische Methodengenerierung, Attributdefinition mit Typen und Standardwerten, Validatoren und Konverter | Gute Leistung | Aktive Community |
Datenklassen | In Python 3.7 integriert, um sie zugänglicher zu machen | An die Python-Version gebunden | Integrierte Python-Bibliothek |
attrs und dataclasses sind schneller als pydantic1.
Leistung:
attrs bietet aufgrund seiner optimierten Implementierungen im Allgemeinen eine bessere Leistung als manuell geschriebene Klassen oder andere Bibliotheken.
Beispiel aus der Praxis:
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 ist eine leistungsstarke Bibliothek, die Python-Klassendefinitionen vereinfacht und gleichzeitig robuste Funktionen für die Datenvalidierung und -manipulation bereitstellt. Seine Fähigkeit, Boilerplate-Code zu reduzieren, die Lesbarkeit zu verbessern und die Leistung zu steigern, macht es zu einem unschätzbar wertvollen Werkzeug für Python-Entwickler.
Community-Ressourcen:
Probieren Sie attrs bei Ihrem nächsten Projekt aus und erleben Sie die Vorteile aus erster Hand. Teilen Sie Ihre Erfahrungen mit der Community und tragen Sie zu ihrer Weiterentwicklung bei. Viel Spaß beim Codieren!
https://stefan.sofa-rockers.org/2020/05/29/attrs-dataclasses-pydantic/ ↩
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3