Pour appeler la méthode d'une classe normale, créez un objet et appelez-le. Ou, je pense que vous pouvez l'appeler directement avec @classmethod ou @staticmethod.
Mais comme le titre l'indique, je pourrais l'appeler directement.
Python 3.8.2
Préparons un échantillon simple. Dans le code ci-dessous, @staticmethod n'est pas ajouté, mais la méthode foo () peut être appelée directement.
>>> class A:
... def foo(): # @méthode statique non jointe
... print('Hello foo')
...
>>> A.foo()
Hello foo <===Je peux vous appeler directement pour une raison quelconque
>>> A().foo()
Traceback (most recent call last): <===Ne peut pas être appelé depuis un objet
File "<stdin>", line 1, in <module>
TypeError: foo() takes 0 positional arguments but 1 was given
>>>
Maintenant, mettons-le. Puisque @staticmethod est attaché, il peut être appelé directement, mais il peut également être appelé depuis un objet.
>>> class B:
... @staticmethod # @attach méthode statique
... def foo():
... print('Hello foo')
...
>>> B.foo()
Hello foo
>>> B().foo()
Hello foo <===Peut également être appelé depuis un objet
>>>
Comme vous pouvez le voir ci-dessus, il semble qu'il n'y ait que ** s'il peut être appelé à partir d'un objet **, mais je ne suis pas sûr.
Jusqu'à très récemment, je ne savais pas que python3 avait une telle spécification. Cependant, il est plus facile de comprendre si vous ajoutez @staticmethod, je vais donc continuer à l'ajouter.
Voyons comment c'était en Python2
Python 2.7.16
>>> class A:
... def foo(): # @méthode statique non jointe
... print('Hello foo')
...
>>> A.foo()
Traceback (most recent call last): <===N'appelez pas directement
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): <===Bien sûr pas de l'objet
File "<stdin>", line 1, in <module>
TypeError: foo() takes no arguments (1 given)
>>>
>>>
>>> class B:
... @staticmethod # @attach méthode statique
... def foo():
... print('Hello foo')
...
>>> B.foo()
Hello foo <=== @La méthode statique peut être appelée
>>> B().foo()
Hello foo
>>>
En regardant cela, Python 2 n'est pas bon. Mais pourquoi Python 3 est-il devenu OK? préoccupation.
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