1766 votes

Signification de @classmethod et @staticmethod pour débutant

Que signifient @classmethod et @staticmethod en Python, et en quoi diffèrent-ils? Quand devrais-je les utiliser, pourquoi devrais-je les utiliser, et comment devrais-je les utiliser?

D'après ce que je comprends, @classmethod indique à une classe qu'il s'agit d'une méthode qui doit être héritée dans les sous-classes, ou... quelque chose comme ça. Cependant, quel est l'intérêt de cela? Pourquoi ne pas simplement définir la méthode de classe sans ajouter @classmethod ou @staticmethod ou toute autre définition @?

38voto

Krishnendu Kunti Points 397

On utiliserait @classmethod lorsque l'on voudrait changer le comportement de la méthode en fonction de la sous-classe qui appelle la méthode. rappelez-vous que nous avons une référence à la classe appelante dans une méthode de classe.

Lors de l'utilisation de statique, vous voudriez que le comportement reste inchangé à travers les sous-classes

Exemple:

class Héros:

  @staticmethod
  def dire_bonjour():
     print("Salut...")

  @classmethod
  def dire_bonjour_classe(cls):
     if(cls.__name__=="FilsHéros"):
        print("Salut fiston")
     elif(cls.__name__=="FilleHéros"):
        print("Salut princesse")

class FilsHéros(Héros):
  def dire_bonjour_fils(self):
     print("test bonjour")

class FilleHéros(Héros):
  def dire_bonjour_fille(self):
     print("test bonjour fille")

testfils = FilsHéros()

testfils.dire_bonjour_classe() #Sortie: "Salut fiston"

testfils.dire_bonjour() #Sorties: "Salut..."

testfille = FilleHéros()

testfille.dire_bonjour_classe() #Sorties: "Salut princesse"

testfille.dire_bonjour() #Sorties: "Salut..."

36voto

SIslam Points 4075

Une petite compilation

@staticmethod Une façon d'écrire une méthode à l'intérieur d'une classe sans référence à l'objet sur lequel elle est appelée. Ainsi, pas besoin de passer d'argument implicite comme self ou cls. Elle est écrite exactement de la même manière qu'à l'extérieur de la classe, mais ce n'est pas inutile en python car si vous avez besoin d'encapsuler une méthode à l'intérieur d'une classe puisque cette méthode doit faire partie de cette classe @staticmethod est utile dans ce cas.

@classmethod Il est important lorsque vous voulez écrire une méthode de fabrique et par cette méthode personnalisée, des attributs peuvent être attachés dans une classe. Ces attributs peuvent être redéfinis dans la classe héritée.

Une comparaison entre ces deux méthodes peut être la suivante

Table

2voto

Ke Zhang Points 585

@classmethod

@classmethod peut être comparé à __init__. Vous pourriez penser que c'est un autre __init__(). C'est la façon dont Python réalise la surcharge de constructeur de classe en C++.

class C:
    def __init__(self, parameters):
        ....

    @classmethod
    def construct_from_func(cls, parameters):
        ....

obj1 = C(parameters)
obj2 = C.construct_from_func(parameters)

remarquez qu'ils ont tous les deux une référence de classe en premier argument dans la définition tandis que __init__ utilise self mais construct_from_func utilise cls conventionnellement.

@staticmethod

@staticmethod peut être comparé à méthode d'objet

class C:
    def __init__(self):
        ....

    @staticmethod
    def static_method(args):
        ....

    def normal_method(parameters):
        ....

result = C.static_method(parameters)
result = obj.normal_method(parameters)

1voto

AyiF Points 87

Je suis un débutant sur ce site, j'ai lu toutes les réponses ci-dessus, et j'ai obtenu les informations que je voulais. Cependant, je n'ai pas le droit de voter. Donc je veux commencer sur StackOverflow avec la réponse telle que je la comprends.

  • @staticmethod n'a pas besoin de self ou cls comme premier paramètre de la méthode
  • La fonction enveloppée par @staticmethod ou @classmethod peut être appelée par une instance ou une variable de classe
  • La fonction décorée par @staticmethod affecte une sorte de 'propriété immuable' que l'héritage de sous-classe ne peut pas écraser, car la fonction de classe de base est enveloppée par un décorateur @staticmethod.
  • @classmethod a besoin de cls (le nom de la classe, vous pouvez changer le nom de la variable si vous le souhaitez, mais ce n'est pas recommandé) comme premier paramètre de la fonction
  • @classmethod est toujours utilisé de manière de sous-classe, l'héritage de sous-classe peut changer l'effet de la fonction de classe de base, c'est-à-dire que la fonction de classe de base enveloppée par @classmethod peut être écrasée par différentes sous-classes.

1 votes

Je ne suis pas sûr de ce que vous voulez dire par immutable dans ce contexte?

0voto

boson Points 328

Une façon légèrement différente de le penser qui pourrait être utile pour quelqu'un... Une méthode de classe est utilisée dans une superclasse pour définir comment cette méthode doit se comporter lorsqu'elle est appelée par différentes classes enfants. Une méthode statique est utilisée lorsque nous voulons renvoyer la même chose indépendamment de la classe enfant que nous appelons.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X