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 :

Decorateur pour methode


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Decorateur pour methode
    Bonjour,

    Je voudrais bien utiliser les décorateurs dans mes scripts afin de simplement printer quand est ce que je rentre et sort d'une fonction ou méthode Rien de plus simple me direz vous.

    La class inOut fonctionne bien pour une fonction, mais quand il s'agit d'une méthode au sein d'une class la bête ne fonctionne plus. J'ai l'impression que le problème est au niveau des attributs de la class qui ne sont pas envoyés.


    Voici le code :
    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 inOut(object):
        def __init__(self, f):
            self.f = f
     
        def __call__(self, *args, **kwargs):
            print 'start'
            functionReturn = self.f(*args, **kwargs)
            print 'end'
            return functionReturn
     
    class toto():
        def __init__(self):
            self.x = 5
     
        @inOut
        def bla(self):
            print self.x
     
    maClass = toto()
    maClass.bla()
    Je pensais effectuer l'envoie des attributs comme cela @inOut(self), mais cela ne fonctionne pas.

    Et malheureusement mes connaissances ne sont pas assez bonne pour trouver la solution.

    Merci d'avance

  2. #2
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Les décorateurs représentent un exercice relativement difficile à maîtriser car demandant un certaine gymnastique mentale... A mon humble avis, tu veux démarrer un peu trop fort, je te conseil de bien comprendre les mécanismes les plus simple des décorateurs, avant de tester des constructions plus complexes les exploitant.

    Sans avoir bien compris ce que tu cherchait à faire, voici un exemple dont le code est très proche de ce que tu as essayé :
    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
    >>> class Formater(object):
    	def __init__(s, format_string):
    		s.format_string = format_string
    	def __call__(s,_callable):
    		def wrapper(*args,**kwargs):
    			return s.format_string.format(_callable(*args,**kwargs))
    		return wrapper
     
     
    >>> debug_decorator = Formater('DEBUG : {}')
    >>> class Foo(object):
    	x = 'fooooo'
            @debug_decorator
    	def dbg(s):
    		return str(s.x)
     
     
    >>> a=Foo()
    >>> a.dbg()
    'DEBUG : fooooo'

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Dans ton exemple, tu n'as pas besoin d'avoir un décorateur sous forme de classe: une fonction suffit.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def inOut(fonc):
        def appelfonc(*args, **kwargs):
            print "start"
            result = fonc(*args, **kwargs)
            print "end"
            return result
        return appelfonc
    Appliqué au reste de ton code, le résultat affiché est bien:

    On utilise les décorateurs sous forme de classe lorsqu'on a à stocker des infos intermédiaires mises à jour à chaque appel.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  4. #4
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Ah ba oui j'aurais pas trouvé tout seul...

    Il est vrai que l'utilisation d'une class dans mon cas n'est pas obligatoire. Je pense donc continuer avec une fonction.

    Merci beaucoup N.tox et tyrtamos je vais regarder cela de plus pres afin de mieux comprendre

  5. #5
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Je pensais avoir mis un lien, mais j'ai de toute évidence oublié :[*]thread traitant du sujet[/list]


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

Discussions similaires

  1. Réponses: 12
    Dernier message: 02/12/2010, 11h36
  2. [XL-2007] Meme nom pour methode et proprieté
    Par Bonero dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 17/08/2010, 14h12
  3. Formulaire sans bouton pour methode POST
    Par rems033 dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 05/06/2008, 15h19
  4. Decorateur pour les montant (doubles)
    Par badoress dans le forum Struts 1
    Réponses: 4
    Dernier message: 28/03/2008, 17h51
  5. [JUnit] Pour tester les methodes d'acces à une sgdb
    Par yanis97 dans le forum Tests et Performance
    Réponses: 2
    Dernier message: 15/04/2004, 15h55

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