Bei der Integration einer Django-App, die ich noch nicht benutzt habe, habe ich zwei verschiedene Möglichkeiten gefunden, Funktionen in Klassen zu definieren. Der Autor scheint sie beide sehr bewusst zu benutzen. Die erste ist, den ich mir selbst eine Menge verwenden:Wann sollte ich @classmethod und wann def-Methode (self) verwenden?
class Dummy(object):
def some_function(self,*args,**kwargs):
do something here
self is the class instance
Das andere ist, die ich nicht verwenden, vor allem, weil ich nicht verstehe, wenn es zu benutzen, und was für:
class Dummy(object):
@classmethod
def some_function(cls,*args,**kwargs):
do something here
cls refers to what?
in dem Python docs wird die classmethod
decorator mit diesem Satz erklärt:
Eine Klassenmethode erhält die Klasse als implizites erstes Argument, nur wie eine Instanzmethode die Instanz empfängt.
Also ich denke, cls
zu Dummy
bezieht sich selbst (die class
, nicht die Instanz). Ich verstehe nicht genau, warum dies existiert, weil ich immer dies tun könnte:
type(self).do_something_with_the_class
Dies ist nur aus Gründen der Klarheit, oder habe ich den wichtigsten Teil verpassen: spooky und faszinierende Dinge, die nicht sein könnten fertig ohne es?
Nice one: Ich mag die Aufteilung der Antwort in wie - warum. Soweit ich es jetzt verstanden habe, erlaubt @classmethod den Zugriff auf die Funktion, ohne dass eine Instanz benötigt wird. Genau das habe ich gesucht, danke. – marue
@marue Gern geschehen! – Marcin
Ich würde sagen, Aufruf von Klassenmethoden auf Instanzen ist schlechte Codierung Stil - nur kein Grund, dies zu tun und kann nur zu Verwirrung führen. Aber ja, es funktioniert (Java erlaubt das Gleiche, gibt aber eine Kompilierungswarnung aus, wenn statische Methoden durch Instanzen aufgerufen werden) – Voo