ProgrammierungPython-Entwickler

Erklären Sie den Unterschied zwischen einer Klassenmethode (@classmethod), einer statischen Methode (@staticmethod) und einer normalen Instanzmethode in Python. In welchen Fällen sollte man was wählen?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort.

  • Normale Instanzmethode — erhält als ersten Parameter self, also einen Verweis auf das spezifische Objekt. Wird verwendet, um auf den Zustand des Objekts zuzugreifen oder ihn zu ändern.
  • @classmethod erhält als ersten Parameter cls — einen Verweis auf die Klasse selbst, nicht auf das Objekt. Wird für Fabrikmethoden oder Methoden verwendet, die mit der Klasse im Allgemeinen arbeiten.
  • @staticmethod erhält keine impliziten Argumente. Dies ist eine normale Funktion, die im Klassenraum platziert ist — zur logischen Gruppierung.

Beispiel:

class MyClass: def instance_method(self): print(f"Instanz: {self}") @classmethod def class_method(cls): print(f"Klasse: {cls.__name__}") @staticmethod def static_method(): print("Einfach eine Funktion") obj = MyClass() obj.instance_method() # self — das ist obj MyClass.class_method() # cls — das ist MyClass MyClass.static_method() # kein self/cls

Falsche Frage.

Häufige Frage:

Kann man eine Klassenmethode über eine Instanz aufrufen? Was unterscheidet sich vom Aufruf über die Klasse selbst?

Antwort: Ja, die Klassenmethode kann sowohl über eine Instanz als auch über die Klasse selbst aufgerufen werden. Es spielt keine Rolle, woher der Aufruf kommt — der erste Parameter ist immer die Klasse, nicht die Instanz. Bei einem Aufruf über die Instanz wird ihre Klasse als cls übergeben.

Beispiele für reale Fehler aufgrund mangelnden Wissens über die Feinheiten des Themas.


Geschichte

Im Projekt wurden alle Fabrikmethoden statisch gemacht (@staticmethod), aber innen musste man den Namen der Unterklasse wissen — das war nicht möglich. Wir haben es auf @classmethod umgestellt, um den cls-Verweis zu erhalten.


Geschichte

Für die Generierung einzigartiger IDs von Instanzen wurde eine normale Methode (self) verwendet, aber es hätte eine Klassenmethode sein müssen, da der Zähler für die Klasse gemeinsam und nicht für jedes Objekt sein sollte.


Geschichte

Der Entwickler hat Geschäftslogik, die nicht mit der Klasse verbunden ist, in eine statische Methode innerhalb der Klasse gelegt. Andere konnten diese Funktion nicht finden, da sie nicht erwarteten, dass sie im Namensraum einer anderen Klasse ist, was die Wartung erschwerte.