@staticmethod
Une 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.
Exemple
#class Grade:
def __init__(self, points):
if not Grade.is_valid(points):
raise ValueError("Les points doivent être compris entre 0 et 100")
self.points = points
@staticmethod
def is_valid(points):
return 0 <= points <= 100
@staticmethod
def to_percent(points, maximum):
return round(points / maximum * 100)
print(Grade.is_valid(85), Grade.is_valid(120))
print(Grade.to_percent(18, 24))
print(list(filter(Grade.is_valid, [85, 120, -5, 64])))
print(Grade(72).is_valid(50))Définition et utilisation
#Le décorateur @staticmethod crée une méthode statique : une fonction qui appartient à la classe, mais qui ne reçoit automatiquement aucun premier argument. Elle n’a ni self ni cls, donc elle n’a pas non plus accès aux attributs de l’objet ou de la classe, sauf si vous les lui passez explicitement.
Vous appelez une méthode statique via la classe (Grade.is_valid(72)) ou via un objet, et le résultat ne dépend que des arguments. Elle sert aux fonctions utilitaires qui appartiennent logiquement à la classe, par exemple une validation ou un calcul, mais qui n’ont pas besoin de ses données. Les placer dans la classe regroupe du code lié et facilite sa recherche.
Si une fonction utilitaire n’est liée à aucune classe, mieux vaut généralement la laisser comme une fonction ordinaire dans le module. Quand une méthode doit créer des objets de la classe ou utiliser ses attributs, c’est @classmethod qu’il vous faut.
Syntaxe
#class Nom:
@staticmethod
def méthode(arguments):
...
Nom.méthode(arguments)Plus d’exemples
#class Course:
count = 0
def __init__(self, title):
self.title = title
Course.count += 1
def describe(self):
return f"Cours {self.title}"
@classmethod
def total(cls):
return f"Cours : {cls.count}"
@staticmethod
def slugify(title):
return title.lower().replace(" ", "-")
python = Course("Python depuis zéro")
print(python.describe())
print(Course.total())
print(Course.slugify("Python depuis zéro"))Une méthode ordinaire reçoit l’objet (self), une méthode de classe reçoit la classe (cls), et une méthode statique reçoit seulement ce que vous lui passez.
Bonnes pratiques
#- Si une méthode n’utilise pas
self, demandez-vous si elle ne devrait pas être statique, voire sortir complètement de la classe. - Appelez plutôt une méthode statique par le nom de la classe. On voit ainsi immédiatement qu’elle ne dépend pas de l’état d’un objet.
- Les méthodes statiques sont faciles à tester, car leur résultat ne dépend que des arguments.
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.
- @classmethodUne méthode qui reçoit la classe (cls) au lieu d’un objet. Elle sert le plus souvent de constructeur alternatif.
- 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.
- 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.