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 :

Modification de classe à la volée


Sujet :

Python

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 47
    Par défaut Modification de classe à la volée
    Bonjour,

    Voici mon problème :

    J'ai une classe test contenu dans le fichier A

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    class test:
         def aff(self,i):
             print i
    J'aimerais savoir si il est possible de modifier le comportement de la méthode aff à partir d'un autre script. Et si oui comment ?

    Merci par avance,
    Crazymonkey.

  2. #2
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Citation Envoyé par crazymonkey Voir le message
    J'aimerais savoir si il est possible de modifier le comportement de la méthode aff à partir d'un autre script. Et si oui comment
    Tu peux surclasser la méthode.
    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
    #!/usr/bin/env python
    #coding=utf-8
     
    import fichierA
     
    class autre(fichierA.test):
         def aff(self):
             print 'Autre renvoie i^2 : ' +str(self.i**2)
     
     
    a = autre(5)
    a.aff()
     
    t = fichierA.test(5)
    t.aff()
    Le script ci-dessus et fichierA sont dans le même dossier.

    CONTENU DU FICHIER A :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/usr/bin/env python
    #coding=utf-8
     
    class test:
        def __init__(self, i):
            self.i = i 
     
        def aff(self):
            print self.i

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 47
    Par défaut
    Merci pour ton aide rambc =),

    Mais je n'ai pas du comprendre comment utiliser ton exemple, je n'ai pas réussi à intercepter l'appel de la méthode aff et à la remplacer par sa surcharge.

    Je ne sais pas si j'ai été très clair dans mon premier message, ce que je souhaite c'est intercepter chaque appel d'une méthode pour la remplacer par une autre.

  4. #4
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    Bonjour,

    tu peux remplacer les méthodes dynamiquement:
    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
    # -*-coding:utf-8-*-
     
     
    class A(object):
     
        def la_methode(self, i):
            """la méthode originale, retourne le carré de i"""
            return i**2
     
     
    print A().la_methode(4)
     
    def nouvelle_methode(self, i):
     
        """la nouvelle méthode, retourne le cube de i"""
        return i**3
     
    ancienne_methode = A.la_methode
     
    A.la_methode = nouvelle_methode
     
    print A().la_methode(4)
     
    A.la_methode = ancienne_methode
     
    print A().la_methode(4)

  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
    Citation Envoyé par pacificator Voir le message
    tu peux remplacer les méthodes dynamiquement:
    Haha L'auteur du topic a bien choisi son pseudo, puisque cette technique s'appelle le "Monkey Patching"

  6. #6
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    Salut,
    Citation Envoyé par Antoine_935 Voir le message
    Haha L'auteur du topic a bien choisi son pseudo, puisque cette technique s'appelle le "Monkey Patching"
    un peu bourrin comme méthode?

    Je ne connaissais pas le "Monkey Patching", maintenant c'est fait

    A chacun la résponsabilité de l'utiliser (ou pas )

  7. #7
    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
    Ce n'est effectivement pas la solution la plus "propre". Mais comme on dit, tout dépend de la définition de propre

    Cela dit, si on sait extactement ce que l'on fait, ça peut être une technique intéressante

    La premier usage que je lui vois, c'est de corriger des bugs ou rajouter des fonctionnalités sur des librairies dont on n'a pas le contrôle. Ce cas peut se présenter si vous travaillez sur un serveur dont vous n'êtes pas l'administrateur, par exemple.

    Soit dit en passant, le monkey patching est très proche des décorateurs, quand on y réfléchit. On peut d'ailleurs s'en servir si on veut des décorateurs en python < 2.4:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @decorateur
    def maFonction2_4(args):
        pass
     
    # Est, en gros, identique à
    def maFonction2_3(args):
        pass
     
    maFonction2_3 = decorateur(maFonction2_3)

  8. #8
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 47
    Par défaut
    Citation Envoyé par Antoine_935 Voir le message
    Haha L'auteur du topic a bien choisi son pseudo, puisque cette technique s'appelle le "Monkey Patching"
    Je sens que je vais bien m'entendre avec cette technique

    En tout cas merci à tous pour votre aide, j'ai de quoi m'occuper maintenant

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Désérialisation et modification de classe à la volée
    Par mtranchant dans le forum Général Java
    Réponses: 3
    Dernier message: 02/02/2012, 11h55
  2. Réponses: 3
    Dernier message: 04/09/2007, 16h00
  3. modification des pages à la volée
    Par bertil dans le forum Apache
    Réponses: 2
    Dernier message: 28/06/2006, 15h34
  4. [Classloader]mon progr ne marche plus après modif des *.class
    Par Melchisedec dans le forum API standards et tierces
    Réponses: 16
    Dernier message: 30/04/2006, 20h48
  5. Création de classes à la volée...
    Par ouiffi dans le forum Langage
    Réponses: 8
    Dernier message: 16/12/2005, 18h01

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