Salut la compagnie
je suis nouveau dans le monde pythonique et je me demandais quelle etait la difference entre une staticmethod et une classmethod ?
Merci beaucoup pour votre attention.
Version imprimable
Salut la compagnie
je suis nouveau dans le monde pythonique et je me demandais quelle etait la difference entre une staticmethod et une classmethod ?
Merci beaucoup pour votre attention.
Hum... il s'agit de notions générales à la programmation objet et non spécifiques à Python
Une méthode de classe est une méthode associée à un objet de la classe (qu'on appelle aussi "instance de classe"). Elle lui est associée parce qu'elle utilise les spécificités de l'instance en question
Exemple
Une méthode statique est une méthode qui appartient à la classe elle-même. On n'a pas besoin de créer une variable appartenant à cette classe pour l'utiliser. C'est plutôt utilisé quand on veut créer des classes d'utilitaires et non des classes représentatives d'objets...Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 #!/usr/bin/env python # coding: Latin-1 -*- class Toto: def __init__(self, val): self.val=val def affich(self): print "je suis l'objet %s et ma valeur est %d" % (self, self.val) a=Toto(12) print a b=Toto(18) print b a.affich() b.affich()
Exemple
On peut se dire que la classe Toto n'est pas utile et qu'on obtiendra le même résultat avec une fonction "def affich(x)". Mais utiliser une méthode staique permet de créer différentes méthodes de même nom mais appartenant à des classes différentes qui pourront donc faire des actions distinctes. Moi je m'en sers avec ma bdd. J'ai une classe par table et chaque classe possède les méthodes "insert", "update", etc. Mais les règles d'insertion de la table x ne sont pas les mêmes que pour la table y (contraintes d'intégrité)Code:
1
2
3
4
5
6
7
8
9 #!/usr/bin/env python # coding: Latin-1 -*- class Toto: @staticmethod def affich(x): print "j'affiche %s" % (x) Toto.affich()
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 #!/usr/bin/env python # coding: Latin-1 -*- class tableA: @staticmethod def insert(x, y): ... vérification que l insertion dans tableA est possible... ...insertion... class tableB: @staticmethod def insert(x, y): ... vérification que l insertion dans tableB est possible... ...insertion... tableA.insert(x, y) tableB.insert(z, t) tableA.insert(z, x) etc...
Bonjour,
oui, mais sve@r a raison: en plus en Python il y a les classmethod. Une classmethod reçoit en premier paramètre une classe (cls, de meme qu'une methode d'instance recoit self).
Pour moi la principale difference est que si on l'appelle d'une classe dérivée on peut malgré tout savoir avec quelle classe on l'a appelé:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 class example(object): def __init__(self): print 'init example' @classmethod def cm(cls): print 'cm',cls @staticmethod def sm(): print 'sm' >>> example().cm() cm <class '__main__.example'>
Ca peut notamment être utile pour écrire un constructeur de classe qui fonctionne pour instancier des classes dérivées.Code:
1
2
3
4
5
6 class derived(example): pass >>> derived().cm() cm <class '__main__.derived'>
Merci beaucoup pour vos reponses, c'est exactement ce que je voulais savoir.
Bonne continuation les gars.