Es gab eine Diskussion im Chat über eine Frage (die Frage selbst ist für diese irrelevant), die ergeben hat, dass ich Python möglicherweise überhaupt nicht kenne.
Obwohl sich die Terminologie in den verschiedenen Sprachen unterscheidet, können wir meiner Meinung nach Funktionen im Allgemeinen wie folgt einteilen:
- [freie] Funktionen
- statische Methoden / statische Elementfunktionen
- nicht statische Methoden / nicht statische Elementfunktionen
Anscheinend gibt es in Python eine andere Art von Funktion, die nicht in die obigen Kategorien passt, eine Methode, die aber "ihre Klasse nicht kennt".
Was sind "Klassenmethoden" und "Instanzmethoden" in Python?
python
terminology
Leichtigkeit Rennen mit Monica
quelle
quelle
Antworten:
Die kurze Antwort
Die lange Antwort
Klassenmethoden
Eine Klassenmethode ist eine, die zur gesamten Klasse gehört. Es ist keine Instanz erforderlich. Stattdessen wird die Klasse automatisch als erstes Argument gesendet. Mit dem
@classmethod
Decorator wird eine Klassenmethode deklariert .Beispielsweise:
Instanzmethoden
Auf der anderen Seite, eine Instanz - Methode erfordert eine Instanz, um sie zu nennen, und erfordert keinen Dekorateur. Dies ist bei weitem die gebräuchlichste Methode.
(Hinweis: Das obige ist mit python3; mit python2 wird ein etwas anderer Fehler angezeigt)
Statische Methoden
Eine statische Methode ähnelt einer Klassenmethode, ruft jedoch das Klassenobjekt nicht als automatischen Parameter ab. Es wird mit dem
@staticmethod
Dekorateur erstellt.Dokumentationslinks
Hier sind Links zur entsprechenden python3-Dokumentation:
Die Dokumentation des Datenmodells enthält folgende Informationen zum Unterschied zwischen Klassenmethoden und statischen Methoden:
Verwandte Fragen
quelle
"^ def("
und dann alle Instanzen von gezählt@staticmethod
. Sehr unwissenschaftlich, aber wahrscheinlich im Ballpark.Eine "Instanzmethode" verwendet die in der Instanz enthaltenen Informationen, um herauszufinden, welcher Wert zurückgegeben werden soll (oder welche Nebenwirkung zu erzielen ist). Diese sind sehr verbreitet.
Eine "Klassenmethode" verwendet Informationen über die Klasse (und nicht eine Instanz dieser Klasse), um ihre Funktion zu beeinflussen (normalerweise werden sie zum Erstellen neuer Instanzen als alternative Konstruktoren verwendet und sind daher nicht sehr verbreitet).
Eine "statische Methode" verwendet keine Informationen über die Klasse oder Instanz, um zu berechnen, was sie tut. Es ist in der Regel nur in der Klasse für die Bequemlichkeit. (Daher sind diese auch nicht sehr verbreitet.)
Eine Funktion von X
Denken Sie daran, Mathe-Klasse, "y ist eine Funktion von x
f(x)
,?" Wenden wir das im Code an:Aus dem oben Gesagten ergibt sich, dass
x
sich Änderungen änderny
können, wenn sichx
Änderungen ergeben. Das ist gemeint, wenn wir sagen, dass "y
eine Funktion vonx
" ist.Was wird
y
sein , wennz
ist1
?2
?'FooBarBaz'
?y
ist keine Funktion vonz
,z
kann also alles sein und hat keinen Einfluss auf das Ergebnis der Funktion, vorausgesetzt unserefunction
ist eine reine Funktion. (Wenn esz
als globale Variable zugreift , dann ist es keine reine Funktion - das ist, was mit funktionaler Reinheit gemeint ist.)Beachten Sie beim Lesen der folgenden Beschreibungen Folgendes:
Instanzmethoden
Eine Instanzmethode ist , die Funktion ist eine Funktion von einer Instanz . Die Funktion akzeptiert die Instanz implizit als Argument und die Instanz wird von der Funktion verwendet, um die Ausgabe der Funktion zu bestimmen.
Ein eingebautes Beispiel für eine Instanzmethode ist str.lower:
str.lower
wird für die Instanz der Zeichenfolge aufgerufen und verwendet die in der Instanz enthaltenen Informationen, um herauszufinden, welche neue Zeichenfolge zurückgegeben werden soll.Klassenmethoden:
Denken Sie daran, in Python ist alles ein Objekt. Das heißt, die Klasse ist ein Objekt und kann als Argument an eine Funktion übergeben werden.
Eine Klasse - Methode ist eine Funktion , die eine Funktion ist von der Klasse . Es akzeptiert die Klasse als Argument dafür.
Ein eingebautes Beispiel ist
dict.fromkeys
:Die Funktion kennt implizit ihre eigene Klasse, die Funktion verwendet die Klasse, um die Ausgabe der Funktion zu beeinflussen, und erstellt aus dem Iterablen eine neue Klasse dieser Klasse. Ein OrderedDict demonstriert dies mit der gleichen Methode:
Die Klassenmethode verwendet Informationen zur Klasse (und nicht zu einer Instanz dieser Klasse), um zu bestimmen, welcher Klassentyp zurückgegeben werden soll.
Statische Methoden
Sie erwähnen eine Methode, die "ihre Klasse nicht kennt" - dies ist eine statische Methode in Python. Es wird lediglich der Einfachheit halber an das Klassenobjekt angehängt. Es könnte optional eine separate Funktion in einem anderen Modul sein, aber seine Anrufsignatur wäre dieselbe.
Eine statische Methode ist weder eine Funktion der Klasse noch des Objekts.
Ein eingebautes Beispiel für eine statische Methode ist str.maketrans aus Python 3.
Mit ein paar Argumenten wird ein Wörterbuch erstellt, das nicht von seiner Klasse abhängt.
Dies ist praktisch, da
str
es immer im globalen Namespace verfügbar ist, sodass Sie es problemlos mit der Übersetzungsfunktion verwenden können:In Python 2 müssen Sie über das
string
Modul darauf zugreifen :Beispiel
Lasst uns instanziieren:
Jetzt kann die Instanz alle Methoden aufrufen:
Die Klasse ist jedoch normalerweise nicht zum Aufrufen der Instanzmethode gedacht, obwohl erwartet wird, dass die anderen Methoden aufgerufen werden:
Sie müssten die Instanz explizit übergeben, um die Instanzmethode aufzurufen:
quelle
MyClass(1,2,3)
sondern wieMyClass.get_special(1,2,3)
) und eine statische Methode als einfach eine normale Funktion, die sowieso alleine stehen könnte.Eine "Instanzmethode" ist eine Methode, die das Instanzobjekt als ersten Parameter übergibt, der per Konvention aufgerufen wird
self
. Dies ist die Standardeinstellung.Eine "statische Methode" ist eine Methode ohne den Anfangsparameter
self
. Dies wird mit dem Dekorator @staticmethod implementiert .Eine "Klassenmethode" ist eine Methode, bei der der Anfangsparameter kein Instanzobjekt ist, sondern das Klassenobjekt ( was ein "Klassenobjekt" ist, erfahren Sie in diesem Teil der Python-Dokumentation ), das gemäß der Konvention aufgerufen wird
cls
. Dies wird mit dem @ classmethod decorator implementiert .Die typische Verwendung des Begriffs "statische Methode" in C / C ++ / etc gilt sowohl für Python-Methoden "static" als auch für Python-Methoden "class", da diese beiden Methoden keinen Verweis auf die Instanz enthalten. In C / C ++ / etc haben Methoden normalerweise impliziten Zugriff auf alle Nicht-Instanz-Member / Methoden der Klasse, weshalb diese Unterscheidung wahrscheinlich nur in Sprachen wie Python / Ruby / etc vorhanden ist.
quelle
Class::staticMethod()
und das wars (solange es dir nicht verboten ist, es anzurufen, weilstaticMethod()
es privat ist oder so).