Fonction classmethod() – Python
La fonction classmethod() est une fonction intégrée en Python, qui renvoie une méthode de classe pour une fonction donnée.
Syntaxe:
classmethod(function)
Paramètres:
Cette fonction accepte le nom de la fonction comme paramètre.
Valeur de retour:
Cette fonction renvoie la méthode de classe convertie.
Les méthodes de classmethod() sont liées à une classe plutôt qu’à un objet. Les méthodes de classe peuvent être appelées à la fois par des classes et par des objets. Ces méthodes peuvent être appelées avec une classe ou avec un objet. Regardons un exemple.
Exemple 1:
class Person: # créer une variable str = "Welcome to WayToLearnX!" # créer une fonction def show(obj): print("La valeur de str est : ", obj.str) # Il ne peut être appelé qu'avec un objet et non avec une classe Person.show = classmethod(Person.show) # maintenant cette méthode peut être appelée comme classmethod # la méthode show() est appelée une méthode de classe Person.show()
Sortie:
La valeur de str est : Welcome to WayToLearnX!
Le décorateur @classmethod
Le décorateur @classmethod est un décorateur de fonction intégré qui est une expression qui est évaluée après la définition de votre fonction. Le résultat de cette évaluation masque votre définition de fonction.
Syntaxe:
class MaClasse(object): @classmethod def maFonction(cls, arg1, arg2, ...):
Paramètres:
maFonction: la fonction qui doit être convertie en méthode de classe.
Valeur de retour:
Renvoie une méthode de classe pour la fonction.
- Une méthode de classe est une méthode qui est liée à la classe et non à l’objet de la classe.
- Ils ont accès à l’état de la classe car il prend un paramètre de classe qui pointe vers la classe et non l’instance d’objet.
- Il peut modifier l’état de classe qui s’appliquerait à toutes les instances de la classe. Par exemple, il peut modifier une variable de classe qui serait applicable à toutes les instances.
Exemple 2:
Dans l’exemple ci-dessous, nous utilisons staticmethod() et classmethod() pour vérifier que le nom de la personne ne dépasse pas 20 caractères.
class Person(object): def __init__(self, name, age): self.name = name self.age = age @classmethod def get_person(cls, name): return cls(name, "") @staticmethod def validate_name(p_name): return len(p_name) <= 20 print (Person.validate_name("Alex Babtise"))
Sortie:
True
Méthode statique (@staticmethod ): N’est pas lié à une instance ou à une classe et vous pouvez simplement l’appeler en utilisant le nom de la classe (Person.validate_name()).
Avec staticmethods, ni self (l’instance d’objet) ni cls (la classe) n’est implicitement passé comme premier argument. Ils se comportent comme des fonctions simples, sauf que vous pouvez les appeler à partir d’une instance ou à partir d’une classe.
Mouais. Dans l’exemple 2, je ne vois pas l’utilité de la fonction get_person() qui n’est pas utilisée. De là, l’utilité du classmethod reste totalement inexpliquée.
Et il faudrait harmoniser. Soit c’est « nom », soit c’est « name ». Mais écrire dans le __init__ () l’instruction self.nom=name amène un NameError.