Erklärung zur Lektion
Nach dieser Lektion kannst du:
__str__ anpassen.__str__ und dem für Entwickler gedachten __repr__ verstehen.@dataclass und typisierten Feldern deklarieren.Python nennt Methoden mit Namen wie __str__ und __repr__ Dunder-Methoden (kurz für „double underscore“, also doppelter Unterstrich). str(obj) und print(obj) verwenden __str__, sofern vorhanden. repr(obj) soll Entwicklern helfen, ein Objekt zu untersuchen; standardmäßig zeigt Python möglicherweise eine allgemeine Darstellung aus Klasse und Adresse.
Für datenorientierte Klassen erstellt @dataclass aus dataclasses automatisch gängige Methoden auf Basis der deklarierten, typannotierten Felder. Dazu gehören ein Initialisierer, eine nützliche Darstellung und wertbasierte Gleichheit (==). Typannotationen beschreiben Felder; sie validieren Typen zur Laufzeit nicht automatisch.
Du kannst in einer Dataclass trotzdem ein eigenes __str__ definieren, um die Anzeige zu steuern, und behältst dabei den erzeugten Initialisierer und die Gleichheit. Bevorzuge Dataclasses für einfache strukturierte Datensätze; behalte komplexes Verhalten in gewöhnlichen Klassen, wenn das für mehr Klarheit sorgt.
__str__ bereitstellenclass Server:
def __init__(self, name, region):
self.name = name
self.region = region
def __str__(self):
return f"{self.name}@{self.region}"
print(Server("worker", "eu"))Ausgabe:
worker@eu__str__ muss einen String zurückgeben, nicht ausgeben.
Diese Klasse definiert beide Darstellungen für unterschiedliche Zielgruppen.
class Build:
def __init__(self, number):
self.number = number
def __str__(self):
return f"Build #{self.number}"
def __repr__(self):
return f"Build(number={self.number})"
build = Build(9)
print(str(build))
print(repr(build))Ausgabe:
Build #9
Build(number=9)@dataclass den Initialisierer erstellen lassenfrom dataclasses import dataclass
@dataclass
class Job:
name: str
retries: int
job = Job("backup", 2)
print(job.name)
print(repr(job))Ausgabe:
backup
Job(name='backup', retries=2)Die Felder werden automatisch zu Konstruktorparametern.
Zwei verschiedene Instanzen können trotzdem gleiche Daten darstellen.
from dataclasses import dataclass
@dataclass
class Version:
component: str
major: int
first = Version("api", 2)
second = Version("api", 2)
print(first == second)
print(first is second)Ausgabe:
True
False| Bedarf | Python |
|---|---|
| Menschenfreundlicher String | __str__(self) gibt Text zurück |
| Darstellung für Entwickler | __repr__(self) gibt Text zurück |
| Konstruktor für Datensätze | @dataclass mit annotierten Feldern |
| Gleiche Feldwerte | first == second |
| Genau dasselbe Objekt | first is second |
None aus __str__ zurückgeben; Python verlangt einen String.is verwenden, um unabhängige Datensätze nach ihrem Wert zu vergleichen.@dataclass das Schreiben eigener Methoden verhindert; du kannst das Verhalten weiterhin anpassen.