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 :

Implémentation du Pattern Adapter (Wrapper) en Python


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Implémentation du Pattern Adapter (Wrapper) en Python
    Bonjour à tous,

    Désolé si le probléme a déjà été résolu sur ce forum!

    Comme le titre l'indique, je veux implémenter le pattern adaptateur en Python pour résoudre un problème de compatibilité d'interfaces. Ayant trouvé le principe de ce pattern (ICI), j'ai voulu l'appliquer sur un exemple simple. En effet, j'ai une classe Francais (Cible) qui posséde une méthode lire() et une classe English (adaptée) qui contient une méthode read(). Et je veux que, si j'appelle la méthode lire() de la classe Francais, la méthode read() de la classe English soit exécutée. J'ai pensé alors au pattern Adapter comme solution (Vous validez le choix, je suppose!). J'ai créé une classe Traduire, qui hérite de Francais et English, dans laquelle j'ai une méthode lire() qui traduit (appelle) la méthode read() de la classe English. Voici mes classes:

    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
    class English(object):
            def __init__(self):
                    return
     
            def read(self):
                    print "Hello"
     
    class Francais(object):
        def __init__(self):
                return
     
        def lire(self):
                print "toto"
     
    class Traduire(Francais, English):
     
            def __init__(self):
                    English.__init__(self)
     
     
            def lire(self):
            self.read()
     
     
    fr = Francais()    
    fr.lire()
    Comme vous pouvez comprendre, je veux voir afficher "Hello", mais j'obtiens "toto".
    Je voudrais savoir où se trouve le souci!
    Merci d'avance pour votre aide

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Où est le problème ?

    Si on lit bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class Francais(object):
        def __init__(self):
            return
        def lire(self):
            print "toto"
     
    fr = Francais()
    fr.lire()
    Ce code me semble bien faire ce qu'on lui demande, non ?

    Maintenant, si le but est de tester les propriétés de polymorphisme du langage, peut-être que ceci conviendra mieux:
    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
     
    class English(object):
        def __init__(self):
            pass
     
        def read(self):
            return "Hello"
     
    class Francais(object):
        def __init__(self):
            pass
     
        def lire(self):
            return "toto"
     
    class Traduire(Francais, English):
        def __init__(self):
            English.__init__(self)
     
        def trad(self):
            orig = self.read()
            out = self.lire()
            print "%s = %s" %(orig, out)
     
    tr = Traduire()
    tr.trad()
    Il s'agit bien sur d'un simple exercice, non nécessaire pour accomplir le travail qui est demandé ici.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Salut VinsS,
    J'ai bien compris le code que vous m'avez proposé mais ce n'est pas ce que souhaite avoir en réalité...

    Citation Envoyé par VinsS Voir le message
    Il s'agit bien sur d'un simple exercice, non nécessaire pour accomplir le travail qui est demandé ici.
    Peut être oui, ce n'est pas nécessaire!
    Je vous expose alors mon problème sans passer par cet exercice:
    Déjà, ma question de départ est: Est-il possible d'exécuter une méthode d'une sous-classe en invoquant simplement une méthode de même nom de la super classe?
    Je m'explique:
    En fait, à partir d'un script qui contient des méthodes (abstraites) d'une classe, je souhaite avoir les résultats des méthodes d'une autre classe. Donc la première classe contient des méthodes non implémentées (c'est pas comme dans l'exemple, oui!!!) et en faisant appel à ces méthodes, mon souhait est de voir exécuter les méthodes de la deuxième. C'est pour celà que j'avais pensé à créer une troisième nouvelle classe qui contiendrait des méthodes de même nom que la première mais dans ces méthodes j'encapsule (ou j'appelle tout simplement) celles de la deuxième classe. Et mon but final est de faire abstraction de toutes ces deux dernières classes; c'est-à-dire, dans mon script, il n'y aura que les méthodes de la première classe.
    J'espère que j'ai été clair...

  4. #4
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 654
    Points : 1 150
    Points
    1 150
    Par défaut
    Salut,

    Pas sûr d'avoir tout saisis, mais j'ai l'impression que ce à quoi tu penses est un "proxy". Voici un lien vers un blog (très intéressant au passage) qui en parle (exemples à l'appui):

    http://sametmax.com/un-objet-proxy-c...-quoi-ca-sert/

    J

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    En fait, à partir d'un script qui contient des méthodes (abstraites) d'une classe, je souhaite avoir les résultats des méthodes d'une autre classe. Donc la première classe contient des méthodes non implémentées (c'est pas comme dans l'exemple, oui!!!) et en faisant appel à ces méthodes, mon souhait est de voir exécuter les méthodes de la deuxième.
    De toutes façons, vous ne pouvez appeler que les méthodes d'une instance "concrète" d'une classe C qui réalisera l'interface attendue IF. Avec un langage comme Java, C réalise explicitement l'interface. Avec Python, vous pouvez utiliser le module ABC pour "forcer" un peu le formel de la chose.
    La question est de savoir comment sera réalise l'assemblage entre le "concret" et l'"abstrait", mais le client verra toujours une classe "concrete".

    Je ne comprends pas trop pourquoi vous parliez de pattern adapter dans le premier post alors que votre besoin semble plutôt relever "template method" ou de "mixin":

    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
    class Template:
        def request(self):
            self._step_one()
            self._step_two()
     
        def _step_one(self):
            raise Exception('pure abstract method')
     
        def _step_two(self):
            raise Exception('pure abstract method')
     
    class Real(Template):
        def _step_one(self):
            print ('_step_one')
     
        def _step_two(self):
            print ('_step_two')
     
    # code client
    real = Real()
    real.request()
    Si vous voulez faire cela "a la mixin", la construction sera plutôt genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Mixin:
        def _step_one(self):
            print ('_step_one')
     
        def _step_two(self):
            print ('_step_two')
     
    class Real(Mixin, Template): pass
     
    # code client
    real = Real()
    real.request()
    Vous avez sur le site développez, une rubrique Design Pattern pour trouver le pattern le plus adapte a votre problème. Réaliser le code correspondant en Python est généralement plus simple qu'avec d'autres langages, encore faut-il savoir ce qu'on veut.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Julien N Voir le message
    Salut,

    Pas sûr d'avoir tout saisis, mais j'ai l'impression que ce à quoi tu penses est un "proxy". Voici un lien vers un blog (très intéressant au passage) qui en parle (exemples à l'appui):

    http://sametmax.com/un-objet-proxy-c...-quoi-ca-sert/

    J
    Salut Julien N!

    Merci beaucoup

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Je ne comprends pas trop pourquoi vous parliez de pattern adapter dans le premier post alors que votre besoin semble plutôt relever "template method" ou de "mixin":
    Salut,
    C'est parce que j'avais cru que c'était le pattern qui résoud mon problème.
    Sinon, j'ai vu la solution que vous m'avez proposée, mais il me semble que je ne suis pas trop compris, j'ai dû mal exprimer mon problème ou que ce que je veux n'est pas techniquement possible (Je ne suis pas un grand informaticien, en clair!).
    En gros, dans le code client, je ne veux pas voir apparaitre la classe dont les méthodes sont exécutées en réalité (Encore faut-il qu'il soit réalisable). Donc comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     # code client
    real = Template()
    real.request()

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par lenovice2014 Voir le message
    En gros, dans le code client, je ne veux pas voir apparaitre la classe dont les méthodes sont exécutées en réalité (Encore faut-il qu'il soit réalisable).
    Le code "client" ne verra que ce que vous laissez voir.
    Si vous dites, il ne voit qu'une interface et pas les méthodes qui seront exécutes en réalité.
    Soit, mais il faudra bien associer cette interface a une "réalisation" pour pouvoir l'utiliser (sinon ça sert a quoi?)

    Quand et comment réaliser cette association?
    Soit c'est le "client" soit c'est gérable de façon +/- automatique car fonction de l'OS, de la langue,...

    Tout est possible.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Choix d'implémentation du Pattern Singleton
    Par Sehnsucht dans le forum VB.NET
    Réponses: 1
    Dernier message: 26/07/2010, 09h54
  2. Implémentation du pattern NVI
    Par Mikechaos dans le forum Langage
    Réponses: 7
    Dernier message: 19/05/2010, 20h24
  3. Tutoriel : Implémentation du pattern MVC
    Par Ricky81 dans le forum MVC
    Réponses: 0
    Dernier message: 11/02/2008, 09h51
  4. Réponses: 5
    Dernier message: 10/05/2007, 16h03
  5. Implémentation du pattern Factory
    Par tut dans le forum C++
    Réponses: 6
    Dernier message: 02/08/2006, 13h43

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