Maison > développement back-end > Tutoriel Python > Quelle est la différence entre « @staticmethod » et « @classmethod » en Python ?

Quelle est la différence entre « @staticmethod » et « @classmethod » en Python ?

Barbara Streisand
Libérer: 2024-12-17 01:08:25
original
708 Les gens l'ont consulté

What's the Difference Between `@staticmethod` and `@classmethod` in Python?

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal