Erklärung zur Lektion
super()Nach dieser Lektion kannst du:
super().__init__(...) den geerbten Instanzzustand initialisieren, bevor du neue Attribute hinzufügst.super().method(...) eine Instanzmethode der Elternklasse erweitern, statt ihre Logik zu kopieren.Vererbung (Inheritance) lässt eine Klasse das Verhalten einer anderen wiederverwenden. Setze die Elternklasse in Klammern:
class Job:
pass
class SpecialJob(Job):
passEine Unterklasse erbt zugängliche Methoden und Attribute von ihrer Elternklasse. Sie kann außerdem eigene Attribute und Methoden definieren. Wenn die Unterklasse ein eigenes __init__ definiert, wird der Initialisierer der Elternklasse nicht automatisch aufgerufen. Rufe super().__init__(...) auf, um die Attribute der Elternklasse einzurichten, bevor du neue hinzufügst.
Die Hilfsfunktion super() lässt außerdem eine überschreibende Instanzmethode die Implementierung der Elternklasse aufrufen. So vermeidest du es, funktionierendes Basisverhalten zu duplizieren. Die nächste Lektion behandelt das Überschreiben von Methoden und die Polymorphie ausführlich; verwende vorerst eine Überschreibung nur dann, wenn sie erweitern soll, was die Elternklasse bereits tut.
Eine Unterklasse kann eine Methode der Elternklasse aufrufen, auch wenn sie diese Methode nicht selbst definiert.
class Device:
def __init__(self, identifier):
self.identifier = identifier
def label(self):
return f"Device {self.identifier}"
class Laptop(Device):
pass
print(Laptop("A14").label())Ausgabe:
Device A14Laptop hat die Methode label() von Device geerbt.
Verwende super().__init__, damit die Einrichtung der Elternklasse intakt bleibt.
class Account:
def __init__(self, owner):
self.owner = owner
class PremiumAccount(Account):
def __init__(self, owner, credits):
super().__init__(owner)
self.credits = credits
print(f"{PremiumAccount('Noor', 50).owner}: premium")Ausgabe:
Noor: premiumDie Elternklasse erstellt owner; die Kindklasse fügt credits hinzu.
super() erweiternDie Kindklasse kann das Ergebnis der Elternklasse wiederverwenden und ihre eigenen Informationen anfügen.
class Message:
def __init__(self, text):
self.text = text
def summary(self):
return self.text
class UrgentMessage(Message):
def summary(self):
return f"URGENT: {super().summary()}"
print(UrgentMessage("Restart required").summary())Ausgabe:
URGENT: Restart requiredDie überschriebene Methode ruft die Methode der Elternklasse auf, statt deren Verhalten neu zu schreiben.
Geerbte Methoden können für verschiedene Unterklassen oder Instanzen der Elternklasse aufgerufen werden.
class Counter:
def __init__(self, value):
self.value = value
def double(self):
return self.value * 2
class LabeledCounter(Counter):
def __init__(self, value, label):
super().__init__(value)
self.label = label
print(LabeledCounter(7, "items").double())Ausgabe:
14Die Unterklasse fügt label hinzu, ohne die Methode double() der Elternklasse zu verlieren.
| Ziel | Python |
|---|---|
| Von einer Elternklasse erben | class Child(Parent): |
| Den Initialisierer der Elternklasse ausführen | super().__init__(...) |
| Eine Methode der Elternklasse erweitern | super().method(...) |
| Das Verhalten der Elternklasse unverändert lassen | Diese Methode nicht neu definieren |
__init__ in der Kindklasse definieren, aber vergessen, die Attribute der Elternklasse zu initialisieren.self manuell an super().__init__ übergeben.super() zu erweitern.