Erklärung zur Lektion
Nach dieser Lektion kannst du:
self), eine Klasse (cls) oder keines von beidem braucht.@classmethod definieren und aufrufen, um mit Informationen auf Klassenebene zu arbeiten oder Objekte zu erstellen.@staticmethod für eine Hilfsfunktion definieren und aufrufen, die konzeptionell zu einer Klasse gehört.Eine normale Instanzmethode beginnt mit self, dem aktuellen Objekt. Du hast sie bereits verwendet, um die in __init__ erstellten Attribute zu lesen und zu ändern:
class Job:
def __init__(self, name):
self.name = name
def display_name(self):
return self.name.upper()Eine Klassenmethode beginnt mit cls und wird mit @classmethod markiert. Sie erhält die Klasse automatisch, egal ob du sie über die Klasse oder über eine Instanz aufrufst. Klassenmethoden sind nützlich, um eine gemeinsame Einstellung zu lesen oder eine Instanz aus einem anderen Eingabeformat zu konstruieren.
Eine statische Methode, markiert mit @staticmethod, erhält weder self noch cls automatisch. Verwende sie für eine eng verwandte Berechnung oder Validierung, die den Zustand eines Objekts nicht braucht.
Diese Annotationen verwenden die Syntax @..., aber allgemeine Dekoratoren brauchst du noch nicht. @classmethod und @staticmethod sind die eingebauten Formen, die du in dieser Lektion benötigst.
cls verweist auf die Klasse, sodass das Ergebnis ihre gemeinsame Einstellung verwendet.
class Mailer:
default_sender = "robot@example.com"
@classmethod
def sender(cls):
return cls.default_sender
print(Mailer.sender())Ausgabe:
robot@example.comAnders als eine Instanzmethode kann sie aufgerufen werden, ohne ein Mailer-Objekt zu erzeugen.
Eine statische Methode gruppiert eine Hilfsfunktion mit dem Typ, zu dem sie gehört. Sie akzeptiert nur die Parameter, die du schreibst.
class PortRules:
@staticmethod
def is_allowed(port):
return 1 <= port <= 65535
print(PortRules.is_allowed(443))Ausgabe:
TrueEs gibt weder self noch cls in is_allowed, weil die Methode nur port verwendet.
Eine Klassenmethode kann eine weitere Möglichkeit bieten, eine gültige Instanz zu erstellen.
class Badge:
def __init__(self, title):
self.title = title
@classmethod
def from_text(cls, raw_title):
return cls(raw_title.strip())
print(Badge.from_text(" Operator ").title)Ausgabe:
OperatorMit cls(...) wird eine Instanz der Klasse konstruiert, die den Aufruf erhält.
Eine Methode, die self verwendet, gibt Informationen über das jeweilige Objekt zurück.
class Subscription:
def __init__(self, plan, active):
self.plan = plan
self.active = active
def status(self):
if self.active:
return f"{self.plan}: active"
return f"{self.plan}: inactive"
print(Subscription("starter", False).status())Ausgabe:
starter: inactiveJedes Abonnement kann einen anderen Zustand haben, daher ist eine Instanzmethode angemessen.
| Methode | Erster Parameter | Wird automatisch übergeben | Typische Verwendung |
|---|---|---|---|
| Instanzmethode | self | Objekt | Seine Attribute lesen/aktualisieren |
@classmethod | cls | Klasse | Gemeinsame Einstellungen, alternative Konstruktoren |
@staticmethod | Keiner von beiden | Nichts | Verwandte Validierung, Normalisierung |
@classmethod vergessen und annehmen, dass cls automatisch übergeben wird.self deklarieren, obwohl der Aufrufer nur ihre ausdrücklichen Argumente übergibt.self.setting aktualisieren, obwohl eine von der Klasse gemeinsam genutzte Einstellung geändert werden soll.