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()
Copier après la connexion
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)
Copier après la connexion
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)
Copier après la connexion
Les méthodes statiques ne reçoivent aucun message implicite arguments :
a.static_foo(1)
# executing static_foo(1)
Copier après la connexion
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!