Python Dataclasses

PythonBeginner
Jetzt üben

Einführung

In diesem Lab werden Sie in die Python Dataclasses eingeführt, ein leistungsstarkes Feature, das ab Python 3.7 verfügbar ist. Dataclasses sind reguläre Python-Klassen, die hauptsächlich zur Speicherung von Daten verwendet werden. Sie nutzen einen Decorator, @dataclass, um automatisch spezielle Methoden wie __init__() und __repr__() zu generieren, was den Boilerplate-Code erheblich reduziert.

Im Laufe dieses Labs lernen Sie, wie Sie:

  • Eine einfache Dataclass definieren.
  • Diese mit einer Standardklassenimplementierung vergleichen.
  • Standardwerte für Felder festlegen.
  • Typ-Hinweise (Type Hints) behandeln, einschließlich der Verwendung von typing.Any.

Am Ende dieses Labs werden Sie in der Lage sein, sauberere und prägnantere datenzentrierte Klassen in Python zu schreiben.

Dataclass-Funktionen

In diesem Schritt lernen Sie die grundlegenden Funktionen von Dataclasses kennen. Wir beginnen mit einer Standard-Python-Klasse zur Speicherung von Daten und sehen dann, wie eine Dataclass diese vereinfacht.

Eine Standardklasse erfordert, dass Sie die Methode __init__ manuell schreiben, um Attribute zu initialisieren.

Zum Beispiel würde eine Klasse zur Darstellung einer Zahl wie folgt aussehen:

class Number:
    def __init__(self, val):
        self.val = val

obj = Number(2)
print(obj.val)

Mit dem Dekorator @dataclass generiert Python automatisch die Methode __init__ sowie andere nützliche Methoden wie __repr__ für eine saubere String-Darstellung. Die Hauptanforderung ist, dass Sie Typ-Hinweise (Type Hints) für die Felder angeben müssen.

Hinweis: Wenn Sie mit der Verwendung von WebIDE (ähnlich VS Code) nicht vertraut sind, lernen Sie dies zuerst in diesem Lab.

Erstellen wir dieselbe Number-Klasse mithilfe des Dekorators @dataclass.

Öffnen Sie die Datei features.py im Dateiexplorer auf der linken Seite. Fügen Sie den folgenden Code hinzu:

from dataclasses import dataclass

@dataclass  ## Dieser Dekorator wandelt die Klasse in eine Dataclass um
class Number:
    val: int  ## Typ-Hinweis ist erforderlich

## Die Methode __init__ wird automatisch erstellt
obj = Number(2)

## Geben Sie den Wert des Attributs 'val' aus
print(obj.val)

## Die Methode __repr__ wird ebenfalls automatisch erstellt und liefert eine schöne Darstellung
print(obj)

Führen Sie nun das Skript im Terminal aus, um die Ausgabe zu sehen.

python3 features.py

Sie sehen die folgende Ausgabe. Die erste Zeile ist der Wert des Attributs, und die zweite Zeile ist die saubere Objekt-Darstellung, die von der automatisch generierten Methode __repr__ bereitgestellt wird.

2
Number(val=2)

Wie Sie sehen können, ist die Dataclass-Version prägnanter und erfordert weniger Boilerplate-Code.

Verwendung von Standardwerten

In diesem Schritt erfahren Sie, wie Sie Feldern einer Dataclass Standardwerte hinzufügen können. Dies ist eine gängige Anforderung, wenn einige Attribute optional sind.

Eine wichtige Regel, die Sie beachten müssen, ist, dass jedes Feld mit einem Standardwert nach allen Feldern ohne Standardwerte deklariert werden muss.

Erstellen wir eine Product-Dataclass, bei der name ein erforderliches Feld ist, während count und price optional sind und Standardwerte haben.

Öffnen Sie die Datei defaults.py im Dateiexplorer. Fügen Sie den folgenden Code hinzu:

from dataclasses import dataclass

@dataclass
class Product:
    name: str        ## Erforderliches Feld
    count: int = 0   ## Optionales Feld mit einem Standardwert
    price: float = 0.0  ## Optionales Feld mit einem Standardwert

## Erstellen Sie eine Instanz, die nur das erforderliche Feld 'name' angibt
obj = Product("Python")

## Geben Sie die Attribute aus, um die Standardwerte in Aktion zu sehen
print(f"Name: {obj.name}")
print(f"Count: {obj.count}")
print(f"Price: {obj.price}")

Führen Sie nun das Skript im Terminal aus.

python3 defaults.py

Die Ausgabe zeigt, dass count und price automatisch ihre Standardwerte zugewiesen bekommen haben.

Name: Python
Count: 0
Price: 0.0

Diese Funktion macht die Erstellung von Objekten mit optionalen Attributen sehr bequem.

Umgang mit Typ-Hinweisen (Type Hints)

In diesem Schritt werden Sie die Anforderung verstehen, Typ-Hinweise in Dataclasses zu verwenden. Wie Sie gesehen haben, ist die Angabe eines Typs für jedes Feld zwingend erforderlich, wenn eine Dataclass definiert wird.

Es kann jedoch Situationen geben, in denen Sie keinen konkreten Datentyp für ein Feld angeben möchten oder können. Für diese Fälle bietet das typing-Modul von Python einen speziellen Typ namens Any. Die Verwendung von Any teilt dem Typ-Checker (Type Checker) mit, dass ein Wert von beliebiger Art sein kann.

Erstellen wir eine Dataclass, in der wir Any für die Felder verwenden.

Öffnen Sie die Datei type_hints.py im Dateiexplorer und fügen Sie den folgenden Code hinzu:

from dataclasses import dataclass
from typing import Any

@dataclass
class WithoutExplicitTypes:
   name: Any
   value: Any = 42

## Erstellen Sie eine Instanz, bei der 'name' ein String ist. 'value' verwendet seinen Standardwert.
obj1 = WithoutExplicitTypes(name="Test")
print(f"Object 1: name={obj1.name}, value={obj1.value}")

## Erstellen Sie eine weitere Instanz, bei der 'name' ein Integer und 'value' ein String ist.
obj2 = WithoutExplicitTypes(name=123, value="hello")
print(f"Object 2: name={obj2.name}, value={obj2.value}")

Führen Sie nun das Skript im Terminal aus.

python3 type_hints.py

Sie sehen die folgende Ausgabe, die demonstriert, dass die Felder Werte unterschiedlicher Typen aufnehmen können.

Object 1: name=Test, value=42
Object 2: name=123, value=hello

Obwohl Any Flexibilität bietet, ist es im Allgemeinen eine gute Vorgehensweise, wann immer möglich spezifische Typen zu verwenden, um Ihren Code robuster und selbstdokumentierender zu gestalten.

Zusammenfassung

In diesem Lab haben Sie gelernt, wie Sie die Dataclasses von Python verwenden, um prägnante und lesbare datenzentrierte Klassen zu erstellen.

Sie haben die folgenden Schlüsselkonzepte behandelt:

  • Der @dataclass-Decorator generiert automatisch spezielle Methoden wie __init__() und __repr__(), wodurch Boilerplate-Code reduziert wird.
  • Wie Felder mit Standardwerten definiert werden und die Regel, dass diese Feldern ohne Standardwerte folgen müssen.
  • Die obligatorische Natur von Typ-Hinweisen (Type Hints) in Dataclasses und wie typing.Any für Felder verwendet wird, bei denen kein spezifischer Typ gewünscht ist.

Dataclasses sind ein mächtiges Werkzeug im modernen Python, um sauberen, wartbaren und effizienten Code zu schreiben, insbesondere wenn es um Klassen geht, die hauptsächlich Zustände speichern.