@classmethod
Une méthode qui reçoit la classe (cls) au lieu d’un objet. Elle sert le plus souvent de constructeur alternatif.
Exemple
#class Student:
def __init__(self, name, points):
self.name = name
self.points = points
@classmethod
def from_text(cls, text):
name, points = text.split(";")
return cls(name, int(points))
@classmethod
def from_dict(cls, data):
return cls(data["name"], data.get("points", 0))
léa = Student.from_text("Léa;250")
lucas = Student.from_dict({"name": "Lucas"})
print(léa.name, léa.points)
print(lucas.name, lucas.points)Définition et utilisation
#Le décorateur @classmethod crée une méthode de classe. Comme premier argument, elle reçoit non pas un objet, mais la classe elle-même, nommée par convention cls. On l’appelle généralement par le nom de la classe, par ex. Student.from_text("Léa;250").
Son usage le plus courant est celui de constructeur alternatif : une méthode qui crée un objet à partir de données dans un autre format, comme une chaîne, un dictionnaire ou une ligne de fichier. La méthode prépare les arguments et finit par appeler cls(...). C’est ainsi que fonctionnent les méthodes intégrées dict.fromkeys() ou datetime.fromisoformat().
Comme cls désigne la classe sur laquelle la méthode a été appelée, dans une classe dérivée, cls(...) crée un objet de la classe dérivée, et non de la classe de base. C’est un avantage par rapport à une méthode statique avec le nom de la classe écrit en dur. Les méthodes de classe ont aussi un accès pratique aux attributs de la classe, par exemple des compteurs ou des réglages partagés.
Syntaxe
#class Nom:
@classmethod
def méthode(cls, arguments):
return cls(...)
Nom.méthode(arguments)Plus d’exemples
#class Task:
def __init__(self, number):
self.number = number
@classmethod
def from_code(cls, code):
return cls(code.removeprefix("tâche_"))
class Quiz(Task):
pass
task = Quiz.from_code("tâche_7_3")
print(type(task).__name__, task.number)class Player:
online = 0
def __init__(self, nick):
self.nick = nick
Player.online += 1
@classmethod
def status(cls):
return f"Joueurs en ligne : {cls.online}"
Player("léa_dev")
Player("lucas99")
print(Player.status())Bonnes pratiques
#- Donnez aux constructeurs alternatifs des noms commençant par
from_, par ex.from_json()oufrom_row(). C’est une convention connue de la bibliothèque standard. - Dans une méthode de classe, créez les objets via
cls(...), et non via le nom de la classe. Elle fonctionne alors correctement aussi dans les classes dérivées. - Si une méthode n’a besoin ni de l’objet ni de la classe,
@staticmethodsuffit.
Entrées associées
#- @staticmethod vs @classmethod@staticmethod agit comme une fonction ordinaire sans argument automatique ; @classmethod reçoit la classe comme cls et sert souvent de constructeur alternatif.
- @staticmethodUne méthode qui ne reçoit automatiquement ni l’objet ni la classe. Elle se comporte comme une fonction ordinaire placée dans une classe.
- __init__()Une méthode appelée automatiquement lors de la création d’un objet. Elle y enregistre les données initiales, c’est-à-dire les attributs.
- selfLe premier paramètre d’une méthode : l’objet sur lequel la méthode a été appelée. Il donne accès à ses attributs et à ses autres méthodes.
- HéritageConstruire une classe à partir d’une autre : la classe dérivée reprend les méthodes de la classe de base et peut les étendre ou les redéfinir.
- DécorateursDes fonctions qui enveloppent d’autres fonctions pour leur ajouter un comportement, par ex. journalisation ou contrôle d’accès. Notation @nom.
Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.