„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Warum sollten Sie Attrs häufiger verwenden?

Warum sollten Sie Attrs häufiger verwenden?

Veröffentlicht am 07.11.2024
Durchsuche:230

Why should you use attrs more

Einführung

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:

  • Reduziert den Boilerplate-Code
  • Verbessert die Lesbarkeit und Wartbarkeit des Codes
  • Bietet leistungsstarke Funktionen zur Datenvalidierung und -konvertierung
  • Verbessert die Leistung durch optimierte Implementierungen

2. Erste Schritte mit Attrs

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)

3. Kernfunktionen von attrs

A. Automatische Methodengenerierung:

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

B. Attributdefinition mit Typen und Standardwerten:

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)

C. Validatoren und Konverter:

import attr

def must_be_positive(instance, attribute, value):
    if value 



4. 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 attribute

C. 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:

  • Verwenden Sie Typanmerkungen für eine bessere Lesbarkeit des Codes und IDE-Unterstützung
  • Nutzen Sie Validatoren für die Datenintegrität
  • Eingefrorene Klassen für unveränderliche Objekte verwenden
  • Nutzen Sie die Vorteile der automatischen Methodengenerierung, um Codeduplizierung zu reduzieren

Häufige Fallstricke:

  • Vergessen, @attr.s Decorator für die Klasse zu verwenden
  • Übermäßige Verwendung komplexer Validatoren, die separate Methoden sein könnten
  • Ohne Berücksichtigung der Leistungsauswirkungen einer umfassenden Nutzung von Factory-Funktionen

6. attrs vs. andere Bibliotheken

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.

Vergleich mit Datenklassen:

  • attrs ist funktionsreicher und flexibler
  • Datenklassen sind in Python 3.7 integriert, wodurch sie leichter zugänglich sind
  • attrs bietet in den meisten Fällen eine bessere Leistung
  • Datenklassen sind an die Python-Version gebunden, während Attrs als externe Bibliothek mit jeder Python-Version verwendet werden können.

Vergleich mit Pydantic:

  • pydantic konzentriert sich auf Datenvalidierung und Einstellungsverwaltung
  • attrs ist allgemeiner einsetzbar und lässt sich besser in bestehende Codebasen integrieren
  • pydantic verfügt über eine integrierte JSON-Serialisierung, während attrs zusätzliche Bibliotheken erfordert

Wann sollten Attribute ausgewählt werden:

  • Für komplexe Klassenhierarchien mit benutzerdefinierten Verhaltensweisen
  • Wenn Sie eine detaillierte Kontrolle über Attributdefinitionen benötigen
  • Für Projekte, die Python 2-Kompatibilität erfordern (obwohl jetzt weniger relevant)

7. Leistung und reale Anwendungen

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)

8. Fazit und Aufruf zum Handeln

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:

  • GitHub-Repository: https://github.com/python-attrs/attrs
  • Dokumentation: https://www.attrs.org/
  • PyPI-Seite: https://pypi.org/project/attrs/

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!


  1. https://stefan.sofa-rockers.org/2020/05/29/attrs-dataclasses-pydantic/ ↩

Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/soumendrak/why-should-you-use-attrs-more-4dim?1 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

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