Bei der Integration einer Django-App, die ich zuvor noch nicht verwendet habe, habe ich zwei verschiedene Möglichkeiten gefunden, um Funktionen in Klassen zu definieren. Der Autor scheint beide sehr absichtlich zu verwenden. Der erste ist einer, den ich selbst oft benutze:
class Dummy(object):
def some_function(self,*args,**kwargs):
do something here
self is the class instance
Der andere ist einer, den ich nicht benutze, hauptsächlich, weil ich nicht verstehe, wann ich ihn verwenden soll und wofür:
class Dummy(object):
@classmethod
def some_function(cls,*args,**kwargs):
do something here
cls refers to what?
In den Python-Dokumenten wird der classmethod
Dekorateur mit folgendem Satz erklärt:
Eine Klassenmethode empfängt die Klasse als implizites erstes Argument, genau wie eine Instanzmethode die Instanz empfängt.
Ich cls
beziehe mich also auf sich Dummy
selbst (die class
, nicht die Instanz). Ich verstehe nicht genau, warum das so ist, weil ich das immer tun konnte:
type(self).do_something_with_the_class
Ist das nur der Klarheit halber oder habe ich den wichtigsten Teil verpasst: gruselige und faszinierende Dinge, die ohne sie nicht möglich wären?
self.foo()
es sein sollteBar.foo()
.self.foo()
ist es vorzuziehen, da es sichself
möglicherweise um eine Instanz einer Unterklasse handelt, die eine eigene implementiertfoo
.Bar
, da1+1 == 2 == 1*2
es unmöglich ist, anhand der gezeigten Ergebnisse zu erkennen, dassBar().static_method
tatsächlich aufgerufen wird.Grundsätzlich sollten Sie eine @classmethod verwenden, wenn Sie feststellen, dass die Definition der Methode nicht geändert oder überschrieben wird.
Ein weiteres Problem: Klassenmethoden sind theoretisch schneller als Objektmethoden, da sie nicht instanziiert werden müssen und weniger Speicher benötigen.
quelle
Wenn Sie decorator @classmethod hinzufügen, bedeutet dies, dass Sie diese Methode als statische Methode von Java oder C ++ erstellen. (statische Methode ist ein allgemeiner Begriff, denke ich ;) ) Python hat auch @staticmethod. Der Unterschied zwischen Klassenmethode und statischer Methode besteht darin, ob Sie mithilfe des Arguments oder des Klassennamens selbst auf eine Klasse oder eine statische Variable zugreifen können.
Alle diese Klassen erhöhen cls.cls_var um 1 und drucken es aus.
Und jede Klasse, die denselben Namen in demselben Bereich oder denselben Instanzen verwendet, die mit dieser Klasse erstellt wurden, wird diese Methoden gemeinsam nutzen. Es gibt nur eine TestMethod.cls_var und auch nur eine TestMethod.class_method (), TestMethod.static_method ()
Und wichtige Frage. warum diese Methode benötigt würde.
Klassenmethode oder statische Methode ist nützlich, wenn Sie diese Klasse als Factory erstellen oder wenn Sie Ihre Klasse nur einmal initialisieren müssen. wie einmal Datei öffnen und Feed-Methode verwenden, um die Datei Zeile für Zeile zu lesen.
quelle