Die neue Pycharm-Version (3.1.3 Community Edition) schlägt vor, die Methoden, die mit dem Status des aktuellen Objekts nicht funktionieren, in statische zu konvertieren.
Was ist der praktische Grund dafür? Eine Art von Mikroleistungsoptimierung (-oder-Speicheroptimierung)?
self
irgendwo innerhalb der Methode? (Wenn die Frage wirklich lautet: "Warum haben die Designer von PyCharm es so entworfen ... müssen Sie sie fragen, nicht SO ...)return 1
eine einzeilige Implementierung der Methode. "Mehr" enthält nichts NützlichesAntworten:
PyCharm "denkt", dass Sie vielleicht eine statische Methode haben wollten , aber Sie haben vergessen, sie als statisch zu deklarieren (mithilfe des
@staticmethod
Dekorators).PyCharm schlägt dies vor, da die Methode in ihrem Hauptteil nicht verwendet
self
wird und daher die Klasseninstanz nicht tatsächlich ändert . Daher kann die Methode statisch sein, dh ohne Übergabe einer Klasseninstanz oder ohne eine Klasseninstanz erstellt zu haben.quelle
NotImplementedError
.self
. In diesem Fall ist die Warnung vernachlässigbar und ich markiere sie mit# noinspection PyMethodMayBeStatic
. Es ist schade, dass IntelliJ IDEA nicht anbietet, diesen deaktivierenden Kommentar in die Kontextmenüs für diese Warnung einzufügen.In Übereinstimmung mit @jolvi, @ArundasR und anderen tritt die Warnung für eine Mitgliedsfunktion auf, die nicht verwendet wird
self
.Wenn Sie sicher sind, dass PyCharm falsch ist, dass die Funktion keine sein sollte
@staticmethod
, und wenn Sie null Warnungen bewerten, können Sie diese auf zwei verschiedene Arten entfernen:Problemumgehung Nr. 1
Problemumgehung Nr. 2 [Danke @ DavidPärsson ]
Die Anwendung, die ich dafür hatte (der Grund, warum ich @staticmethod nicht verwenden konnte), bestand darin, eine Tabelle mit Handlerfunktionen zum Antworten auf ein Protokoll-Subtyp-Feld zu erstellen. Alle Handler mussten natürlich die gleiche Form haben (statisch oder nicht statisch). Aber einige haben zufällig nichts mit der Instanz gemacht. Wenn ich diese statisch machen würde, würde ich "TypeError: 'staticmethod' Objekt ist nicht aufrufbar" erhalten.
Die Unterstützung der Bestürzung des OP, die vorschlägt, statische Methoden hinzuzufügen, wann immer Sie können, verstößt gegen das Prinzip, dass es einfacher ist, Code später weniger restriktiv zu machen als mehr - eine statische Methode macht sie jetzt weniger restriktiv, da Sie dies können Rufen Sie class.f () anstelle von instance.f () auf.
Vermutungen, warum diese Warnung existiert:
quelle
# noinspection PyMethodMayBeStatic
über der Methode oder Klasse unterdrückt die Warnung und ist meiner Meinung nach besser als das Aufrufen einer leeren Methode.self
wird in Python3 überhaupt nicht entfernt.Ich denke, dass der Grund für diese Warnung die Konfiguration in Pycharm ist. Sie können die Auswahlmethode unter Editor-> Inspektion möglicherweise statisch deaktivieren
quelle
Ich bin mit den hier gegebenen Antworten einverstanden (Methode verwendet nicht
self
und könnte daher mit dekoriert werden@staticmethod
).Ich möchte hinzufügen, dass Sie die Methode möglicherweise in eine Funktion der obersten Ebene anstelle einer statischen Methode innerhalb einer Klasse verschieben möchten. Einzelheiten finden Sie in dieser Frage und in der akzeptierten Antwort: Python - sollte ich statische Methoden oder Funktionen der obersten Ebene verwenden?
Wenn Sie die Methode auf eine Funktion der obersten Ebene verschieben, wird auch die PyCharm-Warnung behoben.
quelle
self
kein Parameter ist.self
und daher auf oberster Ebene sein könnte. Dies ist jedoch nicht logisch, wenn man sich die Funktionsweise dieser Methode ansieht. Auf oberster Ebene würde sie eher wie eine globale Methode aussehen, solange sie es ist Tatsächlich eine kleine Hilfsmethode für Instanzen, die aus dieser Klasse erstellt wurden. Um meinen Code logisch zu organisieren, ist der Dekorateur die perfekte Lösung.Ich kann mir folgende Vorteile vorstellen, wenn eine Klassenmethode als statisch definiert wird:
Die verbleibenden Vorteile sind wahrscheinlich gering, wenn überhaupt vorhanden:
quelle
bit
ankommt, schneller zu laufen (weil sie in beiden Fällen im RAM laufen), und wie Sie wissen, verfügen Computer jetzt überbunch
Speicher, sodass dies kein Problem mehr darstellt. Beachten Sie auch Ihren ersten Gedanken: Das ist ein prozedurales Verhalten, kein objektorientiertes.Da Sie
self
imbar
Methodenkörper nicht darauf verwiesen haben, fragt PyCharm, ob Sie möglicherweisebar
statisch machen wollten . In anderen Programmiersprachen wie Java gibt es offensichtliche Gründe für die Deklaration einer statischen Methode. In Python besteht der einzige wirkliche Vorteil einer statischen Methode (AFIK) darin, sie ohne eine Instanz der Klasse aufrufen zu können. Wenn dies jedoch Ihr einziger Grund ist, ist es wahrscheinlich besser, eine Funktion der obersten Ebene zu verwenden - wie hier angegeben .Kurz gesagt, ich bin mir nicht hundertprozentig sicher, warum es dort ist. Ich vermute, sie werden es wahrscheinlich in einer kommenden Version entfernen.
quelle
Diese Fehlermeldung hat mir nur ein paar geholfen, da ich nicht bemerkt hatte, dass ich meine Funktion versehentlich mit meinem Testbeispiel-Player geschrieben hatte
statt des richtigen Weges
quelle
Es mag etwas chaotisch sein, aber manchmal müssen Sie einfach nicht darauf zugreifen
self
, aber Sie möchten die Methode lieber in der Klasse behalten und nicht statisch machen. Oder Sie möchten einfach vermeiden, ein paar unansehnliche Dekorateure hinzuzufügen. Hier sind einige mögliche Problemumgehungen für diese Situation.Wenn Ihre Methode nur Nebenwirkungen hat und Sie sich nicht darum kümmern, was sie zurückgibt:
Wenn Sie den Rückgabewert benötigen:
Jetzt wird Ihre Methode verwendet
self
und die Warnung verschwindet!quelle
Der Grund, warum Pycharm es als Warnung macht, weil Python sich selbst als erstes Argument beim Aufrufen einer nicht statischen Methode übergibt (nicht @staticmethod hinzufügen). Pycharm weiß es.
Beispiel:
Ich komme aus Java, in Java heißt "self" "this", Sie müssen nicht self (oder this) als Argument in der Klassenmethode schreiben. Sie können sich innerhalb der Methode einfach nach Bedarf selbst aufrufen. Aber Python "muss" sich selbst als Methodenargument übergeben.
Wenn Sie dies verstehen, benötigen Sie keine Problemumgehung als @ BobStein-Antwort.
quelle
self
so was?