[Linux-bruxelles] [Python] Tableau de methode

Frederic Peters fpeters at entrouvert.com
Lun 22 Nov 09:40:00 CET 2004


Eric Freyens écrivait :

Ta question était posée en ces termes:
> Question subsidiaire, existe-t-il une méthode pour obtenir la liste
> des méthodes d'une classe.
Mais en fait, ce que tu voulais, c'était avoir toutes les méthodes
*commençant par inst*, non ?



> class n51:
>   def __init__(self):
>     self.uP = uP51.uP51()
>     
>   def viewDocumentation(self):
>     """View documentation of instruction"""
>     lst = dir(self.uP)
>     self.ilst = filter(self.isInstr,lst)
>     lilst = len(self.ilst)
>     print self.uP.__doc__
>     for instr in self.ilst:
>       doc = self.uP.__class__.__dict__[instr].__doc__
>       print instr," : ", doc
>     print "Nombre d'instruction :", lilst

On peut commenter sur plusieurs niveaux.

1. multiplication du nombre de variables, ce n'est pas nécessaire, par
   exemple, plutôt que de faire:
       llist = len(self.ilst)
       [...]
       print "Nombre...:", lilst
   il était possible (et plus clair vu qu'il y a une variable en moins
   et qu'on est tout plein à avoir de petits cerveaux) de faire:
       print "Nombre...:", len(self.ilst)

2. filter() (et map()), on en déconseille maintenant l'usage, le même
   résultat pouvant être obtenu avec ce qui est appelé "list
   comprehension":
       lst = dir(self.uP)
       self.ilst = filter(self.isIntr, lst)
   pourrait ainsi devenir:
       self.ilst = [x for x in dir(self.uP) if self.isIntr(x)]

3. Courtes méthodes, utilisées une seule fois, plus la peine:
       self.ilst = [x for x in dir(self.uP) if x.startswith('inst')]

4. Accès direct à __dict__; c'est super Python, on a accès au détail
   de comment les membres/méthodes sont stockés, mais accéder à
   __dict__, quand ce n'est pas absolument nécessaire, ce n'est pas
   très élégant.
       self.uP.__class__.__dict__[instr].__doc__
   deviendrait ainsi
       getattr(self.uP.__class__, instr).__doc__

5. Possibilité de manipuler des classes, pas d'obligation de passer
   par des instances.  Tu instancies ici ta classe uP51() mais en
   fait, tu ne t'intéresses qu'au détail de la classe, tu n'as pas
   besoin d'une instance.
       lst = dir(self.uP)
   pourrait ainsi devenir:
       dir(uP51.uP51)
   Et celui du point précédent:
       getattr(self.uP.__class__, instr).__doc__
   deviendrait:
       getattr(uP51.uP51, instr).__doc__

6. Des indentations de deux espaces, c'est bien trop peu.
       

> Merci de votre aide.

Quelques conseils, tu en fais ce que tu veux.


        Frédéric





Plus d'informations sur la liste de diffusion Linux-bruxelles