Vous pouvez appeler la méthode de la classe directement dans Python3 sans ajouter @staticmethod

J'ai été surpris de pouvoir appeler la méthode de classe directement dans Python3 sans ajouter @staticmethod: scream:

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.

environnement

Python 3.8.2

Appeler sans @staticmethod

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
>>>

Appeler avec @staticmethod

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
>>>

@staticmethod Différence entre avec et sans

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.

Pour votre référence

Voyons comment c'était en Python2

environnement

Python 2.7.16

Vérification

>>> 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.

URL référencée

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

Vous pouvez appeler la méthode de la classe directement dans Python3 sans ajouter @staticmethod
Comment utiliser la méthode __call__ dans la classe Python
Si vous définissez une méthode dans une classe Ruby, puis définissez une méthode dans celle-ci, elle devient une méthode de la classe d'origine.
__init__ appelé par wxPython ou Tkinter était un appel __init__ de la classe héritée en Python
Examiner la classe d'un objet avec python
Une fonction qui mesure le temps de traitement d'une méthode en python
Vérifiez le comportement du destroyer en Python
Si vous voulez un singleton en python, considérez le module comme un singleton
Le résultat de l'installation de python sur Anaconda
Je veux expliquer en détail la classe abstraite (ABCmeta) de Python
Hit une méthode d'une instance de classe avec l'API Web Python Bottle
Principes de base pour exécuter NoxPlayer en Python
À la recherche du FizzBuzz le plus rapide en Python
Classe pour PYTHON qui peut être utilisée sans connaître LDAP
Vous serez ingénieur dans 100 jours - Jour 29 - Python - Bases du langage Python 5
Vous serez ingénieur dans 100 jours - Jour 33 - Python - Bases du langage Python 8
Vous serez ingénieur dans 100 jours --Jour 26 --Python --Basiques du langage Python 3
En Python, changez le comportement de la méthode en fonction de la façon dont elle est appelée
Vous serez ingénieur dans 100 jours --Jour 32 --Python --Basiques du langage Python 7
Vous serez ingénieur dans 100 jours --Jour 28 --Python --Les bases du langage Python 4
Sortie du nombre de cœurs de processeur en Python
Récupérer l'appelant d'une fonction en Python
Faites correspondre la distribution de chaque groupe en Python
Apprenez le modèle de conception "Méthode de modèle" en Python
Afficher le résultat du traitement de la géométrie en Python
J'ai essayé la méthode des moindres carrés en Python
Pour remplacer dynamiquement la méthode suivante en python
Copiez la liste en Python
Apprenez le modèle de conception "Méthode d'usine" en Python
Jusqu'à ce que l'exemple de changefinder s'exécute sur python
Découvrez la fraction de la valeur saisie en python
Trouvez la solution de l'équation d'ordre n avec python
L'histoire de la lecture des données HSPICE en Python
[Note] À propos du rôle du trait de soulignement "_" en Python
Résolution d'équations de mouvement en Python (odeint)
Sortie sous la forme d'un tableau python
Essayez d'implémenter la méthode Monte Carlo en Python
[Python] Comprenez la classe self. Apprenez le rôle de soi à partir du résultat de l'exécution avec ou sans soi.
Un mécanisme pour appeler des méthodes Ruby à partir de Python qui peut être fait en 200 lignes
Ne prenez pas une instance d'une classe d'exception Python directement comme argument de la classe d'exception!
Découvrez la bonne efficacité de calcul de la vectorisation en Python
Comment obtenir le nombre de chiffres en Python
Connaissez l'emplacement du fichier de définition de classe Python.
[Python] Pas de valeur pour l'argument lui-même dans un appel de méthode non lié
Détruire l'expression intermédiaire de la méthode sweep avec Python
[python] Récupère la liste des classes définies dans le module
Déterminer le seuil à l'aide de la méthode P-tile en python
Implémentation python de la classe de régression linéaire bayésienne
L'histoire de FileNotFound en Python open () mode = 'w'
Apprenez le modèle de conception «Chaîne de responsabilité» en Python
Implémenter la solution de l'algèbre de Riccati en Python
Obtenir la taille (nombre d'éléments) de Union Find en Python
Ne pas être conscient du contenu des données en python
Reproduire l'exemple d'exécution du chapitre 4 de Hajipata en Python
Utilisons les données ouvertes de "Mamebus" en Python
Implémentation de l'algorithme "Algorithm Picture Book" en Python3 (Heap Sort Edition)
[Python] Affiche toutes les combinaisons d'éléments de la liste
Résoudre un coup (retour en arrière sans récursivité en Python)