Problème sur les propriétés

Problème sur les propriétés - Python - Programmation

Marsh Posté le 30-12-2005 à 00:48:44    

Salut,
 
j'ai récemment découvert les propriétés (property) dans Python, mais je trouve le comportement un peu étonnant :

Code :
  1. class C:
  2.     def __init__ (self):
  3.         self._id = None
  4.     
  5.     def get_id(self):
  6.         return self._id
  7.     
  8.     def getter_id(self):
  9.         return self._id
  10.     
  11.     def setter_id(self, value):
  12.         self._id = value
  13.     
  14.     id = property(getter_id, setter_id)
  15.     
  16. c = C()
  17. print c.id, c.get_id()
  18. c.id = 2
  19. print c.id, c.get_id()


qui retourne :


jon@deb64:~$ python test.py
None None
2 None
jon@deb64:~$


 ... alors que je m'attendais à "2 2" pour la deuxième ligne ...
 
D'après http://www.python.org/2.2/descrintro.html#property , les "méthodes" setter_id et getter_id ne sont pas vraiment des méthodes (même si on peut les considérer comme telles), mais les infos qu'ils donnent n'ont pas l'air de correspondre à mon cas ci-dessus [:petrus dei]
 
Est-ce que je loupe quelque chose ?

Reply

Marsh Posté le 30-12-2005 à 00:48:44   

Reply

Marsh Posté le 30-12-2005 à 02:44:35    

C'est comme si tu faisais :

Code :
  1. print c.id, c._id


Donc normal que ça donne "2 None" non ?

Reply

Marsh Posté le 30-12-2005 à 02:58:17    

ta classe n'est pas une new style class donc les property n'y marchent pas, tu dois hériter de object.


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 30-12-2005 à 11:33:23    

tomazi a écrit :

C'est comme si tu faisais :

Code :
  1. print c.id, c._id


Donc normal que ça donne "2 None" non ?


Ben justement non, vu que c'est censé représenter la même valeur de l'attribut ...

0x90 a écrit :

ta classe n'est pas une new style class donc les property n'y marchent pas, tu dois hériter de object.


Effectivement, en remplacant par "class C(object):", ça marche mieux. :jap:

Reply

Marsh Posté le 30-12-2005 à 11:48:32    

tomazi a écrit :

C'est comme si tu faisais :

Code :
  1. print c.id, c._id


Donc normal que ça donne "2 None" non ?


No, les deux sont équivalents

0x90 a écrit :

ta classe n'est pas une new style class donc les property n'y marchent pas, tu dois hériter de object.


Burnaid [:sisicaivrai]
 
À noter que les "classic classes" devraient disparaître de Python 3000, tout objet héritant par défaut d'object
 
Jusque là, bien penser à faire hériter toutes les classes d'object (ou une autre classe héritant déjà d'object, int, long, list, tuple, dict, set, ...).
 
Je pense que PyLint ou PyChecker sont capables de vérifier qu'on ne l'a pas oublié, aller voir de ce côté là.

Reply

Marsh Posté le 30-12-2005 à 13:23:30    

masklinn a écrit :

Je pense que PyLint ou PyChecker sont capables de vérifier qu'on ne l'a pas oublié, aller voir de ce côté là.


PyLint ne bronche pas, par contre PyChecker si :jap:

Reply

Marsh Posté le 30-12-2005 à 21:25:59    

Perso j'utilise les deux en général (PyLint avec les paramètres par défaut n'arrête pas de gueuler par contre [:pingouino])
(et j'ai un peu tweaké PyChecker)
(mais faudrait que je leur dise d'arrêter de me faire suer pour des histoires de docstrings [:sisicaivrai])

Reply

Marsh Posté le 30-12-2005 à 21:36:07    

masklinn a écrit :

Perso j'utilise les deux en général (PyLint avec les paramètres par défaut n'arrête pas de gueuler par contre [:pingouino])


Ouais, j'ai vu ça [:pingouino]

Reply

Sujets relatifs:

Leave a Replay

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