accéder au __doc__ d'un property

accéder au __doc__ d'un property - Python - Programmation

Marsh Posté le 15-10-2006 à 23:50:22    

Bonsoir , voici une classe C avec une property p. Je cherche à récupérer l'info. contenue dans  p.__doc__ :
 

Code :
  1. class C(object):
  2.     __p = 0
  3.     def get_p(self):
  4.         return self.__p
  5.     def set_p(self, i):
  6.         self.__p = i
  7.     p = property( get_p, set_p, None, u"TEXTE SUR p" )
  8.     def __repr__(self):
  9.        return self.p.__doc__ # <<<<<<<< et voilà où cela se corse.
  10. print repr(C())


 
J'aimerais bien sûr récupérer comme message : 'TEXTE sur p.'
A la place, j'obtiens le même message que si je demandais un int.__doc__, car ma property p est en effet de type int (suite au __p = 0). Alors comment récupérer malgré tout le p.__doc__ ?
 
Merci de m'aider !  :sweat:


---------------
rule #1 : trust the python
Reply

Marsh Posté le 15-10-2006 à 23:50:22   

Reply

Marsh Posté le 16-10-2006 à 08:22:06    

Problèmes avec ton code, déjà:
 
1. __p est une variable de ta classe là, pas de l'instance, c'est sûr que c'est ce que tu veux? Je ne suis pas vraiment persuadé
2. "__" n'a pas à être utilisé pour créer une variable "semi-privée", ce n'est pas son but, et ce n'est pas pour cette raison qu'il a été inclus au langage, utiliser un seul underscore en préfixe si tu veux signifier qu'une variable est privée e.g. "_p"
3. Ta property ne sert strictement à rien. Si une property ne sert à rien, on en met pas. On est en Python là, pas en Java. Je peux comprendre que ce ne soit qu'un exemple, mais ça reste moyen.
4. La 'magie' des properties fait qu'elles ne sont plus accessibles sur les instances, il faut passer par la classe pour accéder aux métadonnées d'une property:

Code :
  1. class C(object):
  2.     def __init__(self):
  3.         self._p = 0
  4.     def _get_p(self):
  5.         return self._p
  6.     def _set_p(self, p):
  7.         if p >= 0:
  8.             self._p = p
  9.         else:
  10.             raise ValueError('p must be positive')
  11.     p = property(_get_p, _set_p, doc="p should never be negative" )
  12.     def info_p(self):
  13.         return self.__class__.p.__doc__


Code :
  1. >>> C.p
  2. <property object at 0x00F8E738>
  3. >>> c = C()
  4. >>> c.p
  5. 0
  6. >>> c.p = 5
  7. >>> c.p
  8. 5
  9. >>> c.info_p()
  10. 'p should never be negative'


Message édité par masklinn le 16-10-2006 à 08:24:07

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 16-10-2006 à 17:48:51    

>  bonsoir Masklinn, merci pour le coup de main.
 
1. En effet, j'ai merdé : je voulais bien sûr une instance de classe.
2. Je ne savais pas la différence entre __ et _
3. Non, non, mon exemple était pourri dès le départ.
4. Merci pour le tuyeau.
 
Et merci encore : je gagne du temps et surtout je comprends mieux mes erreurs.  :jap:


---------------
rule #1 : trust the python
Reply

Marsh Posté le 16-10-2006 à 18:23:59    

suizokukan a écrit :

2. Je ne savais pas la différence entre __ et _


En fait, "_" ne fait rien, mais comme la notion de "membre privé" n'existe pas en Python ce n'est pas grave. le préfixe "_" signifie "ceci fait partie du fonctionnement interne de ma classe, pas de son API publique, si vous l'utilisez c'est à vos risques et périls, vous risquez de tout pêter ou de voir votre code exploser quand je mettrais à jour mes classes".
 
"__" par contre fait ce qu'on appelle du "name mangling" (un léger mélange entre le nom de classe et le nom de variable). Ca reste trivial d'accéder à la variable, dans les faits le rôle du name mangling est d'éviter les collisions lorsqu'on utilise beaucoup l'héritage. Pas de créer des illusions de variables privées.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed