Sie können die Methode der Klasse direkt in Python3 aufrufen, ohne @staticmethod hinzuzufügen

Ich war überrascht, die Methode der Klasse direkt aufrufen zu können, ohne @staticmethod in Python3 hinzuzufügen: schreien:

Um die Methode einer normalen Klasse aufzurufen, erstellen Sie ein Objekt und rufen Sie es auf. Oder ich denke, Sie können es direkt mit @classmethod oder @staticmethod aufrufen.

Aber wie der Titel schon sagt, könnte ich es direkt nennen.

Umgebung

Python 3.8.2

Rufen Sie ohne @staticmethod auf

Lassen Sie uns eine einfache Probe vorbereiten. Im folgenden Code wird @staticmethod nicht hinzugefügt, aber die foo () -Methode kann direkt aufgerufen werden.

>>> class A:
...     def foo():         # @statische Methode nicht angehängt
...         print('Hello foo')
...
>>> A.foo()
Hello foo       <===Ich kann Sie aus irgendeinem Grund direkt anrufen
>>> A().foo()
Traceback (most recent call last):   <===Kann nicht von einem Objekt aufgerufen werden
  File "<stdin>", line 1, in <module>
TypeError: foo() takes 0 positional arguments but 1 was given
>>>

Rufen Sie mit @staticmethod auf

Jetzt lass es uns anziehen. Natürlich können Sie es direkt aufrufen, da @staticmethod angehängt ist, aber Sie können es auch von einem Objekt aus aufrufen.

>>> class B:
...     @staticmethod      # @statische Methode anhängen
...     def foo():
...         print('Hello foo')
...
>>> B.foo()
Hello foo
>>> B().foo()
Hello foo       <===Kann auch von einem Objekt aufgerufen werden
>>>

@staticmethod Unterschied zwischen mit und ohne

Wie Sie oben sehen können, scheint es nur ** zu geben, ob es von einem Objekt aufgerufen werden kann **, aber ich bin mir nicht sicher.

Bis vor kurzem wusste ich nicht, dass Python3 eine solche Spezifikation hat. Es ist jedoch einfacher zu verstehen, wenn Sie @staticmethod hinzufügen, daher werde ich es weiterhin hinzufügen.

Als Referenz

Mal sehen, wie es in Python2 war

Umgebung

Python 2.7.16

Bestätigung

>>> class A:
...     def foo():               # @statische Methode nicht angehängt
...         print('Hello foo')
... 
>>> A.foo()
Traceback (most recent call last):   <===Rufen Sie nicht direkt an
  File "<stdin>", line 1, in <module>
TypeError: unbound method foo() must be called with A instance as first argument (got nothing instead)
>>> A().foo()
Traceback (most recent call last):    <===Natürlich nicht vom Objekt
  File "<stdin>", line 1, in <module>
TypeError: foo() takes no arguments (1 given)
>>>
>>>
>>> class B:
...     @staticmethod             # @statische Methode anhängen
...     def foo():
...         print('Hello foo')
... 
>>> B.foo()
Hello foo           <=== @statische Methode kann aufgerufen werden
>>> B().foo()
Hello foo
>>>

In Anbetracht dessen ist Python 2 nicht gut. Aber warum wurde Python 3 OK? Besorgnis, Sorge.

Referenzierte URL

https://stackoverflow.com/questions/43587044/do-we-really-need-staticmethod-decorator-in-python-to-declare-static-method https://stackoverflow.com/questions/136097/difference-between-staticmethod-and-classmethod

Recommended Posts

Sie können die Methode der Klasse direkt in Python3 aufrufen, ohne @staticmethod hinzuzufügen
Verwendung der Methode __call__ in der Python-Klasse
Wenn Sie eine Methode in einer Ruby-Klasse definieren und dann eine Methode darin definieren, wird sie zu einer Methode der ursprünglichen Klasse.
__init__, das von wxPython oder Tkinter aufgerufen wurde, war ein __init__ -Aufruf der geerbten Klasse in Python
Untersuchen Sie die Klasse eines Objekts mit Python
Eine Funktion, die die Verarbeitungszeit einer Methode in Python misst
Überprüfen Sie das Verhalten des Zerstörers in Python
Wenn Sie einen Singleton in Python möchten, stellen Sie sich das Modul als Singleton vor
Das Ergebnis der Installation von Python auf Anaconda
Ich möchte die abstrakte Klasse (ABCmeta) von Python im Detail erklären
Treffen Sie eine Methode einer Klasseninstanz mit der Python Bottle Web API
Grundlagen zum Ausführen von NoxPlayer in Python
Auf der Suche nach dem schnellsten FizzBuzz in Python
Klasse für PYTHON, die ohne Kenntnis von LDAP betrieben werden kann
Sie werden in 100 Tagen Ingenieur - 29. Tag - Python - Grundlagen der Python-Sprache 5
Sie werden in 100 Tagen Ingenieur - Tag 33 - Python - Grundlagen der Python-Sprache 8
Sie werden in 100 Tagen Ingenieur - 26. Tag - Python - Grundlagen der Python-Sprache 3
Ändern Sie in Python das Verhalten der Methode je nach Aufruf
Sie werden in 100 Tagen Ingenieur - Tag 32 - Python - Grundlagen der Python-Sprache 7
Sie werden in 100 Tagen Ingenieur - 28. Tag - Python - Grundlagen der Python-Sprache 4
Geben Sie die Anzahl der CPU-Kerne in Python aus
Holen Sie sich den Aufrufer einer Funktion in Python
Passen Sie die Verteilung jeder Gruppe in Python an
Lernen Sie das Entwurfsmuster "Vorlagenmethode" in Python
Zeigen Sie das Ergebnis der Geometrieverarbeitung in Python an
Ich habe die Methode der kleinsten Quadrate in Python ausprobiert
Dynamisches Ersetzen der nächsten Methode in Python
Kopieren Sie die Liste in Python
Lernen Sie das Entwurfsmuster "Factory Method" in Python
Bis das Changefinder-Sample auf Python läuft
Finden Sie den Bruchteil des in Python eingegebenen Werts heraus
Finden Sie die Lösung der Gleichung n-ter Ordnung mit Python
Die Geschichte des Lesens von HSPICE-Daten in Python
[Hinweis] Über die Rolle des Unterstrichs "_" in Python
Lösen von Bewegungsgleichungen in Python (odeint)
Ausgabe in Form eines Python-Arrays
Versuchen Sie, die Monte-Carlo-Methode in Python zu implementieren
[Python] Verstehe das Klassenselbst. Lerne die Rolle des Selbst aus dem Ausführungsergebnis mit oder ohne Selbst.
Ein Mechanismus zum Aufrufen von Ruby-Methoden aus Python, der in 200 Zeilen ausgeführt werden kann
Nehmen Sie eine Instanz einer Python-Ausnahmeklasse nicht direkt als Argument für die Ausnahmeklasse!
Erleben Sie die gute Berechnungseffizienz der Vektorisierung in Python
So ermitteln Sie die Anzahl der Stellen in Python
Kennen Sie den Speicherort der Python-Klassendefinitionsdatei.
[Python] Kein Wert für das Argument selbst im ungebundenen Methodenaufruf
Zerstören Sie den Zwischenausdruck der Sweep-Methode mit Python
[Python] Ruft die Liste der im Modul definierten Klassen ab
Bestimmen Sie den Schwellenwert mithilfe der P-Tile-Methode in Python
Python-Implementierung der Bayes'schen linearen Regressionsklasse
Die Geschichte von FileNotFound im Python open () -Modus = 'w'
Lernen Sie das Entwurfsmuster "Chain of Responsibility" in Python
Implementieren Sie die Lösung der Riccati-Algebra in Python
Ermitteln Sie die Größe (Anzahl der Elemente) von Union Find in Python
Den Inhalt der Daten in Python nicht kennen
Reproduzieren Sie das Ausführungsbeispiel von Kapitel 4 von Hajipata in Python
Verwenden wir die offenen Daten von "Mamebus" in Python
Implementierte den Algorithmus von "Algorithm Picture Book" in Python3 (Heap Sort Edition)
[Python] Gibt alle Kombinationen von Elementen in der Liste aus
Lösen Sie einen Strich (Backtrack ohne Rekursion in Python)