In Python gibt es drei Haupttypen von Methoden: Instanzmethoden, Klassenmethoden und statische Methoden. Historisch gesehen unterstützte Python nur Instanzmethoden (mit dem ersten Parameter self). Im Laufe der Zeit entstand die Notwendigkeit für zusätzliche Methodenarten: die über die Klasse ohne Bindung an ein Objekt zugänglich sind und Zugang zur Klasse selbst haben.
Problem: Es ist häufig erforderlich, Methoden zu erstellen, die nicht vom Zustand der Instanz abhängen (zum Beispiel Fabrikmethoden) oder die überhaupt keinen Kontext der Klasse benötigen, aber logisch zur Struktur der Klasse gehören.
Lösung: Es werden die Dekoratoren @classmethod und @staticmethod verwendet.
Beispielcode:
class Example: def instance_method(self): return f'Instanz: {self}' @classmethod def class_method(cls): return f'Klasse: {cls}' @staticmethod def static_method(): return 'statisch'
Wesentliche Merkmale:
Kann eine statische Methode auf Attribute der Klasse und der Instanz zugreifen?
Nein, eine statische Methode erhält keinen Verweis auf die Klasse oder das Objekt.
class A: x = 10 @staticmethod def f(): # print(self.x) # Fehler pass
Können Klassenmethoden in Vererbern überschrieben werden?
Ja, wenn die classmethod über das Kind aufgerufen wird, ist der erste Parameter immer die tatsächliche Klasse und nicht die Elternklasse.
class Base: @classmethod def name(cls): return cls.__name__ class Child(Base): pass Child.name() # "Child"
Warum kann man self nicht für Klassenmethoden verwenden?
Weil die Klassenmethode nicht mit einem bestimmten Objekt verbunden ist, sondern mit der Klasse insgesamt; self ist ohne Erstellung einer Instanz nicht verfügbar.
Die Fabrikmethode wurde als staticmethod definiert, und innerhalb wird versucht, eine Instanz der Klasse über self zu erstellen, was zu Fehlern oder Code-Duplikation führt.
Vorteile:
Nachteile:
Die Fabrik wurde über classmethod deklariert, innerhalb wird die tatsächliche Klasse (cls) zur Erstellung der Instanz verwendet. Nachfolgende Klassen werden korrekt durch diese Fabrik erstellt.
Vorteile:
Nachteile: