Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de property

Sujet résolu
    29 décembre 2010 à 0:04:27

    Bonjour,

    j'ai créé la classe dans un fichier Electrode.py

    class Electrode:
    
    	def __init__(self,min_value=0,max_value=10,default_value=0):
    		self.max_value = 10
    		self.min_value = 0
    		self.default_value = 0
    		self._current_value = 23
    
    	def _get_current_value(self):
    		print('balise3')
    		return self._current_value
    	
    	def _set_current_value(self, new_value):
    		print('balise2')
    
    	current_value = property(_get_current_value, _set_current_value)
    


    puis j'ai le fichier d'où j'appelle une instance depuis ce fichier (on peut faire abstraction de tout ce qui concerne GTK) :

    import pygtk
    pygtk.require("2.0")
    import gtk
    
    import Electrode
    
    electrode_test = Electrode.Electrode()
    
    class Interface:
    	def __init__(self):
    		interface = gtk.Builder()
    		interface.add_from_file('TrapGUI.glade')
    		
    		self.statusbar = interface.get_object("statusbar")
    		self.spinbutton1 = interface.get_object("spinbutton1")
    		
    		self.parametres = gtk.Adjustment(0, -3, 10, 1, 2)
    		self.spinbutton1.set_adjustment(self.parametres)
    
    		interface.connect_signals(self)
    
    	def on_spinbutton1_value_changed(self, widget):
    		print(electrode_test.current_value)
    		electrode_test.current_value = 2
    		self.statusbar.push(2,str(self.spinbutton1.get_value()))
    


    Lorsque le fais appel à cette fonction on_spin_button1_value_changed, au premier appel, j'ai bien le terminal qui affiche 'balise3' donc on utilise bien la fonction property.
    Mais dès que j'essaye de changer la valeur par l'appel de electrode_test.current_value = 2, on ne passe pas pas la fonction property mais on crée un attribut current_value, donc on ne passe plus jamais par property les appels suivants...

    la console donne lors des appels successifs :

    balise3
    23
    2
    2
    2
    2
    2
    


    Merci
    • Partager sur Facebook
    • Partager sur Twitter
      29 décembre 2010 à 0:24:21

      Bonsoir,

      Il faut que la classe soit "nouveau style". C'est de base en Python 3, mais sinon il faut explicitement hériter de object.

      class Electrode(object):
          pass
      
      • Partager sur Facebook
      • Partager sur Twitter
        29 décembre 2010 à 9:21:34

        Ca marche effectivement très bien !

        Merci beaucoup !
        • Partager sur Facebook
        • Partager sur Twitter
          29 décembre 2010 à 9:47:26

          Au passage un moyen plus lisible d'utiliser les properties est d'utiliser les décorateurs prévus à cet effet:

          class MaClasse(object):
              def __init__(self, val):
                  self._val = val
              
              @property
              def val(self):
              """ 
              La documentation pour le pseudo-attribut 'val' 
              est lue dans le getter
              
              """
                  return self._val
          
              @val.setter
              def val(self, value):
                  try:
                      self._val = int(value)
                  except TypeError:
                      print "val doit être convertible en entier"
          


          C'est quand même plus propre. ;)
          • Partager sur Facebook
          • Partager sur Twitter
          Zeste de Savoir, le site qui en a dans le citron !

          Problème de property

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown