Tester l'existence d'une méthode dans une class

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonsoir les agrumes !

J'aimerais savoir si il est possible en python 3 de tester l’existence d'une méthode dans une class et de ensuite appeler la méthode. Sachant que j'ai le nom de la méthode dans une variable.

Bonne soirée :)

Saying that Java is nice because it works on all OS's is like saying that anal sex is nice because it works on all genders.

+0 -0

Cette réponse a aidé l'auteur du sujet

Conceptuellement, je dirais que l'introspection est à prendre avec des pincettes, il faut toujours se demander s'il n'y a pas d'autres solutions que celle-ci. Ça tombe bien j'en ai une ;)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
>>> class A:
...     pass
... 
>>> a = A()
>>> try:
...     x = a.method()
... except AttributeError:
...     pass
... 
>>> 

En C on utiliserait la technique du LBYL, mais en python on préfère l'EAFP (avec try et except).

Voir une discussion intéressante ICI

Bonne continuation…

+2 -1
Auteur du sujet

Le problème est que j'ai le nom de ma méthode dans une variable, mais je peux faire :

1
2
3
4
5
6
try:
    func = getattr(obj, action) # la variable action contient le nom de ma méthode
except AttributeError:
    pass # do something
else:
    result = func(args)

L'exemple est tiré de l'article donné par Grimur. Mais sinon merci pour LBYL et EAFP que je ne connaissais pas !

Saying that Java is nice because it works on all OS's is like saying that anal sex is nice because it works on all genders.

+0 -0

Je ne comprend pas réellement le problème, c'est sans doute en rapport avec la conception qui n'est pas suffisamment exprimée ici, car tu ne veux pas rentrer dans les détails… Mais le principe est d'exécuter ta méthode directement sans l'utilisation de getattr.

Ma solution, c'est "j'essaie d'exécuter ma méthode de classe et dans le cas où cette méthode n'existe pas, faire autre chose"

Maintenant la question est pourquoi le nom d'une méthode dans une variable, c'est là où plus de détails sur la conception seraient bienvenue, mais c'est toi qui voit.

+0 -0
Auteur du sujet

En fait j'ai un serveur avec bottle.py et une route /cmd/<action> qui me permet de lancer certaine méthode d'une class. Donc je ne sais pas à l'avance quelle méthode je dois appeler. Le but est

Saying that Java is nice because it works on all OS's is like saying that anal sex is nice because it works on all genders.

+0 -0
Auteur du sujet

Merci psycopy mais la proposition de Grimur me parait plus intéressante car je peux en plus récupérer la méthode !

Saying that Java is nice because it works on all OS's is like saying that anal sex is nice because it works on all genders.

+0 -0

Cette réponse a aidé l'auteur du sujet

Pour faire comme fred le conseille, tu peux procéder ainsi :

1
2
3
4
try:
    x = YourClass.__dict__[method_name](obj, args)
except KeyError:
    pass

Édité par Vayel

+1 -0
Auteur du sujet

Ah oui, je connaissais pas __dict__, merci beaucoup Vayel !

Saying that Java is nice because it works on all OS's is like saying that anal sex is nice because it works on all genders.

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte