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.
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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...
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager