Ich bin in Python auf einen ungebundenen Methodenfehler mit dem Code gestoßen
import random
class Sample(object):
'''This class defines various methods related to the sample'''
def drawSample(samplesize,List):
sample=random.sample(List,samplesize)
return sample
Choices=range(100)
print Sample.drawSample(5,Choices)
Nachdem ich hier viele hilfreiche Beiträge gelesen hatte, überlegte ich, wie ich @staticmethod
oben hinzufügen könnte , damit der Code funktioniert. Ich bin ein Python-Neuling. Kann jemand bitte erklären, warum man statische Methoden definieren möchte? Oder warum sind nicht alle Methoden als statische Methoden definiert?
Antworten:
Statische Methoden können nur eingeschränkt verwendet werden, da sie keinen Zugriff auf die Attribute einer Instanz einer Klasse haben (wie dies bei einer regulären Methode der Fall ist) und keinen Zugriff auf die Attribute der Klasse selbst haben (wie dies bei einer Klassenmethode der Fall ist) ).
Daher sind sie für alltägliche Methoden nicht nützlich.
Sie können jedoch nützlich sein, um einige Dienstprogrammfunktionen zusammen mit einer Klasse zu gruppieren - z. B. eine einfache Konvertierung von einem Typ in einen anderen -, für die außer den angegebenen Parametern (und möglicherweise einigen für das Modul globalen Attributen) kein Zugriff auf Informationen erforderlich ist. )
Sie könnten außerhalb der Klasse platziert werden, aber eine Gruppierung innerhalb der Klasse kann sinnvoll sein, wenn sie nur dort anwendbar sind.
Sie können die Methode auch über eine Instanz oder die Klasse anstatt über den Modulnamen referenzieren, um dem Leser zu helfen, zu verstehen, auf welche Instanz die Methode bezogen ist.
quelle
Locale
, deren Instanzen Gebietsschemas (duh) sind. EinegetAvailableLocales()
Methode wäre ein schönes Beispiel für eine statische Methode einer solchen Klasse: Sie gehört eindeutig zur Locale-Klasse, während sie eindeutig zu keiner bestimmten Instanz gehört.class_name.attribute
, nur nichtcls.attribute
oderself.attribute
. Dies gilt für "öffentliche" Attribute. Konventionell sollten Sie auf diese Weise nicht auf Attribute zugreifen, die mit einem Unterstrich verborgen sind, oder auf Namen, die mit zwei Unterstrichen entstellt sind. Dies bedeutet auch, dass Ihr Code anfälliger wird, wenn Attribute die Positionen in der Vererbungshierarchie verschieben.Ausführliche Erläuterungen finden Sie in diesem Artikel .
TL; DR
1. Es beseitigt die Verwendung von
self
Argumenten.2. Es reduziert die Speichernutzung, da Python nicht für jedes instanziierte Objekt eine gebundene Methode instanziieren muss:
3. Es verbessert die Lesbarkeit des Codes und bedeutet, dass die Methode nicht vom Status des Objekts selbst abhängt.
4. Es ermöglicht das Überschreiben von Methoden, da eine Unterklasse diese Methode nicht überschreiben könnte, wenn die Methode auf Modulebene (dh außerhalb der Klasse) definiert würde.
quelle
Dies ist nicht ganz der Punkt Ihrer eigentlichen Frage, aber da Sie gesagt haben, dass Sie ein Python-Neuling sind, wird es vielleicht hilfreich sein, und niemand anderes ist ganz herausgekommen und hat es explizit gesagt.
Ich hätte den obigen Code niemals repariert, indem ich die Methode zu einer statischen Methode gemacht hätte. Ich hätte entweder die Klasse verlassen und nur eine Funktion geschrieben:
Wenn Sie viele verwandte Funktionen haben, können Sie diese in einem Modul gruppieren, dh alle in derselben Datei ablegen, die
sample.py
beispielsweise benannt ist. dannOder ich hätte
__init__
der Klasse eine Methode hinzugefügt und eine Instanz mit nützlichen Methoden erstellt:(Ich habe auch die Fallkonventionen im obigen Beispiel geändert, um sie an den von PEP 8 empfohlenen Stil anzupassen.)
Einer der Vorteile von Python ist, dass Sie nicht gezwungen werden, Klassen für alles zu verwenden. Sie können sie nur verwenden, wenn Daten oder Status vorhanden sind, die den Methoden zugeordnet werden sollen. Dafür sind Klassen vorgesehen. Andernfalls können Sie Funktionen verwenden, für die Funktionen vorgesehen sind.
quelle
Warum sollte man statische Methoden definieren wollen ?
Angenommen , wir haben ein
class
genanntMath
dannNiemand wird ein Objekt erstellen
class Math
und dann Methoden wie
ceil
undfloor
und darauf aufrufenfabs
wollen.Also machen wir sie
static
.Zum Beispiel tun
ist viel besser als
Sie sind also irgendwie nützlich. Sie müssen keine Instanz einer Klasse erstellen, um sie zu verwenden.
Warum sind nicht alle Methoden als statische Methoden definiert? ?
Sie haben keinen Zugriff auf Instanzvariablen.
Deshalb machen wir nicht alle Methoden statisch.
quelle
Math
. Deshalb habe ich groß geschriebenM
.Math
zu einer Klasse zusammengeschlossen haben. Ein Modul passt besser. Versuchen Sie, ein Beispiel für eine Klasse zu finden, die als Klasse sinnvoll ist, und nicht eines, von dem "niemand ein Objekt erstellen möchte" .Wenn Sie ein Funktionsobjekt von einer Objektinstanz aus aufrufen, wird es zu einer gebundenen Methode und das Instanzobjekt selbst wird als erstes Argument übergeben.
Wenn Sie ein
classmethod
Objekt (das ein Funktionsobjekt umschließt) für eine Objektinstanz aufrufen , wird die Klasse des Instanzobjekts als erstes Argument übergeben.Wenn Sie ein
staticmethod
Objekt aufrufen (das ein Funktionsobjekt umschließt), wird kein implizites erstes Argument verwendet.quelle
statische Methoden sind großartig, da Sie keine Instanz des Objekts deklarieren müssen, zu dem die Methode gehört.
Auf der Python-Website finden Sie eine hervorragende Dokumentation zu statischen Methoden:
http://docs.python.org/library/functions.html#staticmethod
quelle
Die Alternativen zu a
staticmethod
sind:classmethod
,instancemethod
, undfunction
. Wenn Sie nicht wissen, um was es sich handelt, scrollen Sie zum letzten Abschnitt. Ob astaticmethod
besser ist als eine dieser Alternativen, hängt davon ab, zu welchem Zweck es geschrieben wurde.Vorteile der statischen Python-Methode
staticmethod
ist a besser als aclassmethod
oderinstancemethod
. Auf diese Weise wird (vom@staticmethod
Dekorateur) klar, dass der Status der Klasse und der Instanz nicht gelesen oder geändert wird. Die Verwendung von afunction
macht diese Unterscheidung jedoch noch deutlicher (siehe Nachteile).staticmethod
ist die gleiche wie die von aclassmethod
oderinstancemethod
, nämlich<instance>.<method>(<arguments>)
. Daher kann es leicht durch eines der drei ersetzt werden, wenn dies später oder in einer abgeleiteten Klasse benötigt wird. Mit einem einfachen kann man das nicht machenfunction
.staticmethod
kann anstelle von a verwendet werdenfunction
, um zu verdeutlichen, dass es subjektiv zu einer Klasse gehört, und um Namespace-Konflikte zu vermeiden.Nachteile der statischen Python-Methode
staticmethod
ist die gleiche wie die von aclassmethod
oderinstancemethod
. Dies maskiert die Tatsache, dass dasstaticmethod
Objekt keine Objektinformationen liest oder ändert. Dies erschwert das Lesen von Code. Warum nicht einfach ein verwendenfunction
?staticmethod
ist schwer wiederzuverwenden, wenn Sie es jemals von außerhalb der Klasse / Instanz aufrufen müssen, in der es definiert wurde. Wenn die Möglichkeit einer Wiederverwendung besteht,function
ist a die bessere Wahl.staticmethod
wird selten verwendet, daher kann es etwas länger dauern, bis Benutzer Code lesen, der einen enthält.Alternativen zu einer statischen Methode in Python
Um die Vorteile der zu diskutieren
staticmethod
, müssen wir wissen, welche Alternativen es gibt und wie sie sich voneinander unterscheiden.staticmethod
gehört zu einer Klasse, kann jedoch nicht auf Instanz- oder Klasseninformationen zugreifen oder diese ändern.Es gibt drei Alternativen dazu:
classmethod
hat Zugriff auf die Klasse des Anrufers.instancemethod
hat Zugriff auf die Instanz des Aufrufers und seine Klasse.function
hat nichts mit Unterricht zu tun. Es ist der Fähigkeit am nächstenstaticmethod
.So sieht das im Code aus:
quelle
Weil Namespace-Funktionen nett sind (wie bereits erwähnt):
Wenn ich explizit auf Methoden eingehen möchte, die den Status des Objekts nicht ändern, verwende ich statische Methoden. Dies entmutigt die Mitarbeiter meines Teams, die Attribute des Objekts in diesen Methoden zu ändern.
Wenn ich wirklich faulen Code umgestalte, versuche ich zunächst, so viele Methoden
@staticmethod
wie möglich zu erstellen . Dadurch kann ich diese Methoden dann in eine Klasse extrahieren - obwohl ich damit einverstanden bin, ist dies selten etwas, das ich verwende, es hat sich jedoch einige Male als hilfreich erwiesen.quelle
Nach meiner Einschätzung gibt es keinen einzigen Leistungsvorteil der Verwendung von
@staticmethod
s im Vergleich zur Definition der Funktion außerhalb und getrennt von der Klasse, von der es sonst wäre@staticmethod
.Das einzige, was ich sagen würde, um ihre Existenz zu rechtfertigen, ist Bequemlichkeit. Statische Methoden sind in anderen gängigen Programmiersprachen üblich. Warum also nicht Python? Wenn Sie eine Funktion mit einem Verhalten erstellen möchten, das sehr eng mit der Klasse verknüpft ist, für die Sie sie erstellen, aber nicht auf die internen Daten einer Instanz der Klasse zugreifen / diese ändern, so dass die Konzeptualisierung als typisch gerechtfertigt ist Methode dieser Klasse schlagen
@staticmethod
Sie dann ein darüber und jeder, der Ihren Code liest, wird sofort viel über die Natur der Methode und ihre Beziehung zur Klasse lernen.Eine Sache, die ich gelegentlich gerne mache, ist das Platzieren von Funktionen, die meine Klasse intern häufig verwendet, in privaten
@staticmethod
s. Auf diese Weise überfalle ich die von meinem Modul bereitgestellte API nicht mit Methoden, die niemand, der mein Modul verwendet, jemals sehen müsste, geschweige denn verwenden würde.quelle
Statische Methoden haben in Python fast keinen Grund. Sie verwenden entweder Instanzmethoden oder Klassenmethoden.
quelle
staticmethod
oder eine Erklärung dafür, was aclassmethod
ist oder warum und wie es "besser" ist als statische.staticmethod
, das Ihre Behauptung stützt, es sei Cruft, oder Georgs Behauptung,classmethod
die stattdessen verwendet werden sollte.