Ist es möglich, statische Methoden in Python zu haben, die ich aufrufen könnte, ohne eine Klasse zu initialisieren, wie:
ClassName.static_method()
quelle
Ist es möglich, statische Methoden in Python zu haben, die ich aufrufen könnte, ohne eine Klasse zu initialisieren, wie:
ClassName.static_method()
Ja, mit dem StaticMethod Decorator
class MyClass(object):
@staticmethod
def the_static_method(x):
print(x)
MyClass.the_static_method(2) # outputs 2
Beachten Sie, dass in einigen Codes möglicherweise die alte Methode zum Definieren einer statischen Methode verwendet wird, die staticmethod
als Funktion und nicht als Dekorator verwendet wird. Dies sollte nur verwendet werden, wenn Sie alte Versionen von Python (2.2 und 2.3) unterstützen müssen.
class MyClass(object):
def the_static_method(x):
print(x)
the_static_method = staticmethod(the_static_method)
MyClass.the_static_method(2) # outputs 2
Dies ist völlig identisch mit dem ersten Beispiel (using @staticmethod
), nur ohne die nette Decorator-Syntax
Schließlich staticmethod()
sparsam verwenden! Es gibt nur sehr wenige Situationen, in denen statische Methoden in Python erforderlich sind, und ich habe gesehen, dass sie oft verwendet wurden, wenn eine separate Funktion der "obersten Ebene" klarer gewesen wäre.
Das Folgende ist aus der Dokumentation wörtlich: :
Eine statische Methode erhält kein implizites erstes Argument. Verwenden Sie dieses Idiom, um eine statische Methode zu deklarieren:
class C: @staticmethod def f(arg1, arg2, ...): ...
Die @staticmethod Form ist eine Funktion Dekorateur - die Beschreibung von Funktionsdefinitionen in siehe Funktionsdefinitionen für weitere Einzelheiten.
Es kann entweder für die Klasse (z. B.
C.f()
) oder für eine Instanz (z. B.C().f()
) aufgerufen werden . Die Instanz wird bis auf ihre Klasse ignoriert.Statische Methoden in Python ähneln denen in Java oder C ++. Ein weiterführendes Konzept finden Sie unter
classmethod()
.Weitere Informationen zu statischen Methoden finden Sie in der Dokumentation zur Standardtyphierarchie unter Die Standardtyphierarchie .
Neu in Version 2.2.
In Version 2.4 geändert: Syntax des Funktionsdekorators hinzugefügt.
@staticmethod
Dekoration hinzufügen oder einen Funktionszeiger verwenden, wenn Sie einfach den erstenself
Parameter vermeiden können ? Nun, für ein Objekta
können Sie nicht aufrufena.your_static_method()
, was in anderen Sprachen erlaubt ist, aber es wird trotzdem als schlechte Praxis angesehen und der Compiler warnt immer davorClassName.methodName()
, als wäre sie statisch, und dannself
wird der Methode keine bereitgestellt. Wie Sie sagten, ist es weiterhin möglich, diese Methode auch als aufzurufenClassInstance.methodName()
, und sieself
wird unabhängig von ihrem Namen als erster Parameter bereitgestellt.Ich denke, dass Steven tatsächlich Recht hat . Um die ursprüngliche Frage zu beantworten, nehmen Sie zum Einrichten einer Klassenmethode einfach an, dass das erste Argument keine aufrufende Instanz ist, und stellen Sie dann sicher, dass Sie die Methode nur aus der Klasse aufrufen.
(Beachten Sie, dass sich diese Antwort auf Python 3.x bezieht. In Python 2.x erhalten Sie eine
TypeError
zum Aufrufen der Methode für die Klasse selbst.)Zum Beispiel:
In diesem Code geht die Methode "rollCall" davon aus, dass das erste Argument keine Instanz ist (wie es wäre, wenn es von einer Instanz anstelle einer Klasse aufgerufen würde). Solange "rollCall" von der Klasse und nicht von einer Instanz aufgerufen wird, funktioniert der Code einwandfrei. Wenn wir versuchen, "rollCall" von einer Instanz aus aufzurufen, z.
Es würde jedoch eine Ausnahme auslösen, da zwei Argumente gesendet würden: sich selbst und -1, und "rollCall" ist nur so definiert, dass ein Argument akzeptiert wird.
Übrigens würde rex.rollCall () die richtige Anzahl von Argumenten senden, aber auch eine Ausnahme auslösen, da jetzt n eine Dog-Instanz (dh rex) darstellt, wenn die Funktion erwartet, dass n numerisch ist.
Hier kommt die Dekoration ins Spiel: Wenn wir der "rollCall" -Methode vorangehen
Wenn wir dann explizit angeben, dass die Methode statisch ist, können wir sie sogar von einer Instanz aus aufrufen. Jetzt,
würde funktionieren. Das Einfügen von @staticmethod vor einer Methodendefinition verhindert dann, dass sich eine Instanz als Argument selbst sendet.
Sie können dies überprüfen, indem Sie den folgenden Code mit und ohne auskommentierte Zeile @staticmethod ausprobieren.
quelle
TypeError: unbound method rollCall() must be called with Dog instance as first argument (got int instance instead)
T.my_static_method()
odertype(my_t_instance).my_static_method()
, da dies klarer ist und sofort klar macht, dass ich eine statische Methode aufrufe.Ja, sehen Sie sich den StaticMethod Decorator an:
quelle
Sie müssen den
@staticmethod
Dekorateur nicht wirklich benutzen . Deklarieren Sie einfach eine Methode (die den Parameter self nicht erwartet) und rufen Sie sie von der Klasse aus auf. Der Dekorateur ist nur für den Fall da, dass Sie ihn auch von einer Instanz aus aufrufen möchten (was Sie nicht wollten).Meistens verwenden Sie jedoch nur Funktionen ...
quelle
class Dummy: def static1(): print "hello from static1" @staticmethod def static2(): print "hello from static2" Dummy.static2() Dummy.static1()
Ausgabe: Hallo von static2 Traceback <letzter Aufruf zuletzt>: Datei "ll.py", Zeile 46, in <module> Dummy.static1 () TypeError: ungebundene Methode static1 () muss sein mit Dummy-Instanz als erstes Argument aufgerufen (bekam stattdessen nichts)self
als erstes Argument übergeben, es sei denn, Sie sagen es nicht. (siehe: Dekorateur)self
Referenz entsprechend ein, je nachdem, wie es aufgerufen wird. Testfall: pastebin.com/12DDV7DB .staticmethod
Dekorator kann die Funktion sowohl für die Klasse als auch für eine Instanz aufgerufen werden (diese Lösung schlägt fehl, wenn die Funktion für eine Instanz aufgerufen wird).class C: def callme(): print('called'); C.callme()
Ja, statische Methoden können wie folgt erstellt werden (obwohl es etwas pythonischer ist , für Methoden Unterstriche anstelle von CamelCase zu verwenden):
Das obige verwendet die Decorator-Syntax. Diese Syntax entspricht
Dies kann genau so verwendet werden, wie Sie es beschrieben haben:
Ein eingebautes Beispiel für eine statische Methode ist
str.maketrans()
Python 3, eine Funktion imstring
Modul in Python 2.Eine andere Option, die wie beschrieben verwendet werden kann, ist die
classmethod
: Der Unterschied besteht darin, dass die Klassenmethode die Klasse als implizites erstes Argument erhält. Wenn sie untergeordnet ist, erhält sie die Unterklasse als implizites erstes Argument.Beachten Sie, dass dies
cls
kein erforderlicher Name für das erste Argument ist, aber die meisten erfahrenen Python-Codierer halten es für schlecht, wenn Sie etwas anderes verwenden.Diese werden typischerweise als alternative Konstruktoren verwendet.
Ein eingebautes Beispiel ist
dict.fromkeys()
:quelle
Abgesehen von den Besonderheiten des Verhaltens statischer Methodenobjekte gibt es eine bestimmte Art von Schönheit, die Sie bei der Organisation Ihres Codes auf Modulebene mit ihnen erzielen können.
...
...
...
Es wird jetzt etwas intuitiver und selbstdokumentierender, in welchem Kontext bestimmte Komponenten verwendet werden sollen, und es eignet sich ideal für die Benennung bestimmter Testfälle sowie für einen einfachen Ansatz, wie Testmodule tatsächlichen Modulen zugeordnet werden, die für Puristen getestet werden .
Ich finde es häufig sinnvoll, diesen Ansatz auf die Organisation des Dienstprogrammcodes eines Projekts anzuwenden. Sehr oft beeilen sich die Leute sofort und erstellen ein
utils
Paket und erhalten 9 Module, von denen eines 120 LOC hat und der Rest bestenfalls zwei Dutzend LOC sind. Ich ziehe es vor, damit zu beginnen und es in ein Paket umzuwandeln und Module nur für die Bestien zu erstellen, die sie wirklich verdienen:quelle
Die vielleicht einfachste Möglichkeit besteht darin, diese Funktionen außerhalb der Klasse zu platzieren:
Mit dieser Methode können Funktionen, die den internen Objektstatus ändern oder verwenden (Nebenwirkungen haben), in der Klasse beibehalten und die wiederverwendbaren Dienstprogrammfunktionen nach draußen verschoben werden.
Angenommen, diese Datei wird aufgerufen
dogs.py
. Um diese zu verwenden, würden Siedogs.barking_sound()
statt anrufendogs.Dog.barking_sound
.Wenn Sie wirklich eine statische Methode müssen Teil der Klasse sein, können Sie das verwenden static Dekorateur.
quelle
Statische Methoden sind also die Methoden, die aufgerufen werden können, ohne das Objekt einer Klasse zu erstellen. Beispielsweise :-
Im obigen Beispiel wird die Methode
add
durch den Klassennamen undA
nicht durch den Objektnamen aufgerufen .quelle
Python Statische Methoden können auf zwei Arten erstellt werden.
Verwenden der statischen Methode ()
Ausgabe:
Ergebnis: 25
Verwenden von @staticmethod
Ausgabe:
Ergebnis: 25
quelle
Ich begegne dieser Frage von Zeit zu Zeit. Der Anwendungsfall und das Beispiel, die ich mag, sind:
Es ist nicht sinnvoll, ein Objekt der Klasse cmath zu erstellen, da ein cmath-Objekt keinen Status enthält. Cmath ist jedoch eine Sammlung von Methoden, die alle in irgendeiner Weise miteinander verbunden sind. In meinem obigen Beispiel wirken alle Funktionen in cmath auf komplexe Weise auf komplexe Zahlen.
quelle