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.
Python 3.8.2
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
>>>
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
>>>
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.
Mal sehen, wie es in Python2 war
Python 2.7.16
>>> 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.
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