IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Proxy pour properties


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut Proxy pour properties
    Salut à tous.

    Créer un proxy pour une méthode n'est pas difficile, mais qu'en est-il pour les proxys de properties ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    >>> class Prop(object):
    ...     def __init__(self):
    ...         self.__model = None
    ...     
    ...     def getModel(self):
    ...         return self.__model
    ...     
    ...     def setModel(self):
    ...         self.__model = model
    ...     
    ...     model = property(getModel, setModel)
    ... 
    >>> class Prox:
    ...     def __init__(self):
    ...         self.__prop = Prop()
    ...         
    ...         # On peu facilement faire des proxy pour fonctions
    ...         self.propGetModel = self.__prop.getModel
    ... 
    ...     # Comment faire un proxy pour les properties de self.__prop ?
    ...     # Autrement dit, comment emuler le code ci-dessous, mais version propre...
    ...     def getPropModel(self):
    ...         return self.__prop.model
    ...     
    ...     def setPropModel(self, new):
    ...         self.__prop.model = new
    ...     
    ...     propModel = property(getPropModel, setPropModel)

  2. #2
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Dans le cas présenté n'y a t'il pas moyen de procéder par héritage afin que le proxy hérite des propriétés ?

  3. #3
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Dans ce cas-ci, effectivement, l'héritage est une bonne solution, mais dans le contexte dans lequel je suis, je n'y ai pas droit.

    Le contexte en question, c'est un pattern Observer, ou plus précisément du MVC.
    Par exemple, un widget Button sera lié à un ButtonModel, qui pourra être partagé avec d'autres Button. C'est ce qui m'empêche de me servir de l'héritage.

  4. #4
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Pourriez vous donner plus de détails sur la finalité, afin de vérifier qu'un proxy est bien une solution conceptuellement viable et qu'il n'en existe pas de meilleure ?

  5. #5
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Voici un résumé de l'implémentation (la totale serait bcp trop longue).
    Elle se calque assez précisément sur le MVC de Swing, que j'apprécie beaucoup et qui me manque atrocement avec gtk.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    class ButtonModel(object):
        def __init__(self, text):
            self.__text = text
     
     
        def getText(self):
            return self.__text
     
        def setText(self, new):
            self.__text = new
            self._fireChangeEvent()
     
        text = property(getText, setText)
     
     
        def _fireChangeEvent():
            # Methode qui envoie un event à chaque Observer enregistré
            # par leur methode stateChanged
     
    class Button:
        def __init__(self, model):
            self.__model = model
            self.__update()
     
        def stateChanged(self, e):
            self.__update()
     
        def __update(self):
            # Met a jour le label du bouton selon le modèle
            self.set_label(self.__model.text)
     
        # Il me faudrait ici une sorte de proxy de la property model.text
        # de manière à ce que le changement du label d'un bouton
        # soit répercuté sur tous les autres.

  6. #6
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Pas sûr que ce soit ça, mais une solution serait que :
    - tous les composants dont l'état doit être tracé soient "Observable" : le modèle et les boutons,
    - un contrôleur soit Observer de ceux-ci et demande aux autres contrôles, les boutons, de se mettre à jour, via "__update".

    Ainsi :
    - si le modèle est changé il prévient le contrôleur qui va invoquer la méthode "__update" de tous les boutons dont il a la charge,
    - si le texte d'un bouton est changé, le bouton prévient le contrôleur qui ira update le modèle, à partir de là c'est comme pour le cas précédent.

    Cependant si tous les boutons doivent être synchronisés, pourquoi peuvent-ils être modifiés indépendamment ?

Discussions similaires

  1. Proxy pour terminal server
    Par ramzi_zi dans le forum Windows
    Réponses: 3
    Dernier message: 29/01/2008, 10h01
  2. Réponses: 7
    Dernier message: 11/12/2007, 03h16
  3. [ISA SERVER 2000] Configurer le proxy pour autoriser les connexions P2P
    Par senator dans le forum Serveurs (Apache, IIS,...)
    Réponses: 2
    Dernier message: 19/01/2007, 10h57
  4. [design][swing] design pour property panel réutilisable
    Par mlequim dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 26/11/2005, 22h07
  5. Connexion derrière un proxy pour Firebird ???
    Par .:morgoth:. dans le forum Connexion aux bases de données
    Réponses: 8
    Dernier message: 17/02/2005, 09h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo