Une méthode statique est une fonction définie dans une classe sans référence à l'instance en construction (pas de paramètre self). C'est donc une simple fonction, définie dans la classe, en général dans le simple but de découper le code.
Un exemple
On veut définir une classe Rationnel. Pour simplifier les fractions, on définit en interne une fonction "de service" pgcd.
class Rationnel:
def __init__(self, numerateur, denominateur = 1):
self.numerateur = numerateur
self.denominateur = denominateur
@staticmethod
def pgcd(a,b):
a, b = abs(a), abs(b)
while b != 0:
a, b = b, a%b
return a
def simplifie(self):
d = Rationnel.pgcd(self.numerateur, self.denominateur)
self.numerateur = self.numerateur//d
self.denominateur = self.denominateur//d
# suivent ici les définitions d'addition, multiplication, etc...
def __str__(self):
if self.numerateur == 0 or self.denominateur == 1:
return str(self.numerateur)
else:
return str(self.numerateur) + '/' + str(self.denominateur)
q = Rationnel(2*3*5, 2**3*5*7)
print(q)
q.simplifie()
print(q)
On obtient :
30/280 3/28
Pour cet exemple, le choix de définir pgcd à l'intérieur de la classe, en @staticmethod, sera sûrement un choix discutable : à partir du
moment où l'on a besoin de faire un peu d'arithmétique, on aura sûrement besoin de cette fonction pour d'autres calculs. Sa définition
en dehors de la classe, dans un module "math" par exemple, sera donc sûrement un meilleur choix.
Mais dans d'autres cas de figures,
il arrive qu'une telle "fonction de service" n'ait son utilité qu'à l'intérieur de la classe, auquel cas
le choix d'une définition en interne à la classe évitera de "polluer" le namespace global.
Remarque
Une remarque sur @staticmethod avec l'exemple de code ci-dessous.
class Rationnel:
def __init__(self, numerateur, denominateur = 1):
self.numerateur = numerateur
self.denominateur = denominateur
def pgcd(a,b):
a, b = abs(a), abs(b)
while b != 0:
a, b = b, a%b
return a
def simplifie(self):
d = Rationnel.pgcd(self.numerateur, self.denominateur)
self.numerateur = self.numerateur//d
self.denominateur = self.denominateur//d
# suivent ici les définitions d'addition, multiplication, etc...
def __str__(self):
if self.numerateur == 0 or self.denominateur == 1:
return str(self.numerateur)
else:
return str(self.numerateur) + '/' + str(self.denominateur)
q = Rationnel(2*3*5, 2**3*5*7)
print(q)
q.simplifie()
print(q)
print(Rationnel.pgcd(3*2*5, 3*5))
# Seul l'appel qui suit provoque une erreur
# (car q est un argument de trop)
# mais ne provoquera plus d'erreur en décorant
# la fonction pgcd par @staticmethod
print(q.pgcd(3*2*5, 3*5))