Comprendre les différences entre les décorateurs @staticmethod et @classmethod en Python
Les décorateurs @staticmethod et @classmethod en Python vous permettent de créer une classe méthodes à plusieurs niveaux avec des comportements différents. Voici une explication détaillée de leurs principales différences :
Conventions d'appel :
-
@staticmethod : Les méthodes statiques ne sont liées à aucune méthode spécifique. instance ou classe. Elles se comportent comme des fonctions normales qui peuvent être appelées directement depuis les instances et les classes.
-
@classmethod : Les méthodes de classe sont liées à la classe elle-même, plutôt qu'à une instance particulière. Ils sont généralement utilisés pour effectuer des opérations sur la classe elle-même, telles que la modification d'attributs ou la création de constructeurs alternatifs.
Signatures de méthode :
- Méthodes statiques ne recevez pas la classe ou l'instance comme premier argument implicite.
- Les méthodes de classe reçoivent la classe comme premier argument implicite. argument.
- Les méthodes d'instance (méthodes sans décorateurs) reçoivent l'instance comme premier argument implicite.
Instanciation :
- Les méthodes statiques peuvent être appelées sans créer d'instance de la classe.
- Les méthodes de classe peuvent être appelées à partir d'instances et classes.
- Les méthodes d'instance ne peuvent être appelées qu'à partir d'instances de la classe.
Exemple pratique :
Considérez l'extrait de code suivant :
class A(object):
def foo(self, x):
print("executing foo({self}, {x})")
@classmethod
def class_foo(cls, x):
print("executing class_foo({cls}, {x})")
@staticmethod
def static_foo(x):
print("executing static_foo({x})")
a = A()
Lors de l'appel de foo, l'instance a est implicitement passée comme première argument :
a.foo(1)
# executing foo(<__main__.A object at 0xb7dbef0c>, 1)
Avec les méthodes de classe, la classe de l'instance est implicitement passée au lieu de self :
a.class_foo(1)
# executing class_foo(<class '__main__.A'>, 1)
Les méthodes statiques ne reçoivent aucun message implicite arguments :
a.static_foo(1)
# executing static_foo(1)
Résumé :
-
@staticmethod les décorateurs créent des méthodes qui se comportent comme des fonctions normales, sans aucune classe implicite ou liaison d'instance.
-
@classmethod les décorateurs créent des méthodes liées à la classe lui-même, leur permettant de modifier les attributs de classe ou de créer des constructeurs alternatifs.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!
Déclaration:Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn