Erklärung zur Lektion
__init__Nach dieser Lektion kannst du:
__init__ definieren und Instanzattribute initialisieren, während ein Objekt erstellt wird.self gespeicherten Attributen unterscheiden.In der vorherigen Lektion hast du eine Klasse erstellt und Attribute angehängt, nachdem du jedes Objekt konstruiert hattest. Das funktioniert, aber man vergisst leicht ein Attribut. Das __init__ von Python initialisiert eine Instanz automatisch, wenn du ihre Klasse aufrufst:
class Task:
def __init__(self, name, owner):
self.name = name
self.owner = ownerTask("build", "Maya") konstruiert ein Objekt und ruft __init__ mit den übergebenen Argumenten auf. Python übergibt self automatisch; du übergibst es nicht selbst. Anders als ein Konstruktor in Java/C# ist __init__ eine Initialisierungsmethode und gibt normalerweise keinen Wert zurück.
Konstruktor-Parameter sind temporäre Eingaben. self.name und self.owner sind Instanzattribute, die über das Objekt verfügbar bleiben. Jeder Aufruf konstruiert eine eigene Instanz mit ihrem eigenen gespeicherten Zustand.
Standardwerte aus Einheit 1 funktionieren auch in __init__: def __init__(self, name, retries=0): lässt Aufrufer die Anzahl der Wiederholungsversuche weglassen. Setze erforderliche Parameter vor optionale.
class Endpoint:
def __init__(self, name, region):
self.name = name
self.region = region
endpoint = Endpoint("billing", "eu")
print(f"{endpoint.name}@{endpoint.region}")Ausgabe:
billing@euDie Konstruktoreingaben werden zu dauerhaften Instanzattributen.
class Deployment:
def __init__(self, tag, ready):
self.tag = tag
self.ready = ready
first = Deployment("v1.4", True)
second = Deployment("v1.5", False)
print(first.ready)
print(second.ready)Ausgabe:
True
FalseDas zweite Objekt überschreibt den Zustand des ersten nicht.
class Queue:
def __init__(self, name, pending=0):
self.name = name
self.pending = pending
normal = Queue("email")
busy = Queue("reports", 4)
print(f"{normal.name}: {normal.pending}")
print(f"{busy.name}: {busy.pending}")Ausgabe:
email: 0
reports: 4Der Standardwert gilt nur, wenn der Aufrufer das Argument weglässt.
class Wallet:
def __init__(self, owner, balance):
self.owner = owner
self.balance = balance
def deposit(self, amount):
if amount > 0:
self.balance += amount
wallet = Wallet("Ari", 20)
wallet.deposit(7)
print(f"Balance: {wallet.balance}")Ausgabe:
Balance: 27Methoden ändern den initialisierten Zustand über self, nicht über eine temporäre lokale Variable.
| Ziel | Syntax |
|---|---|
| Eine Instanz initialisieren | def __init__(self, name): |
| Eine Konstruktoreingabe behalten | self.name = name |
| Ein initialisiertes Objekt erstellen | obj = ClassName(value) |
| Einen optionalen Anfangswert angeben | def __init__(self, name, count=0): |
| Den Zustand des Objekts aktualisieren | self.count += amount |
name = name statt self.name = name schreibst, wird kein Attribut an der Instanz gespeichert.self initialisiert wurde, löst AttributeError aus.__init__ löst einen TypeError aus; verwende andere Methoden, um Ergebnisse zurückzugeben.