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 :

Décorateur de méthode [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de speedy_souris
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 47
    Par défaut Décorateur de méthode
    Bonjour à toutes et tous,
    dans mon apprentissage de python,
    je souhaite approfondir les décorateurs et aussi mieux comprendre l'héritage
    le principe :
    une classe mère Deco qui contient une méthode pour soustraire deux nombres
    une classe fille Test qui hérite de la Deco avec une méthode pour additionner deux nombre
    Objectif :
    décorer la méthode de la classe fille avec un décorateur de la classe mère
    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
    class Deco:
        """Classe qui contient les décorateurs"""
        def __init__(self, nb1, nb2):
            self.nb1 = nb1
            self.nb2 = nb2
     
        def decorator(self, func):
            def soustraction(self):
                result = f"le resultat de l'operation {self.nb1} - {self.nb2} = {self.nb1-self.nb2}"
                return result
            return soustraction
     
    class Test(Deco):
        """teste les décorateurs de methode"""
        def __init__(self, nb1, nb2):
            """constructeur de la classe Test"""
            super().__init__(nb1, nb2)
     
        def traitement(self):
            """additionne les deux nombre"""
            result = f"le resultat de l'opération {self.nb1} + {self.nb2} = {self.nb1+self.nb2}"
            return result
     
    nb1 = 158
    nb2 = 17
    test = Test(nb1, nb2)
    traitement = test.traitement()
    print("Avant la décoration")
    print(traitement)
    traitement = test.decorator(test)
    print("Après la décoration")
    print(traitement)
    resultat du shell:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Avant la décoration
    le resultat de l'opération 158 + 17 = 175
    Après la décoration
    <function Deco.decorator.<locals>.soustraction at 0x7f1ac94dd7b8>
    je ne vois pas ce que j'ai loupé
    et pouvait vous m'indiquer ci cela est une bonne pratique de regrouper les décorateurs dans une classe ?

    merci

  2. #2
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    decorator retourne la fonction soustraction et non pas son exécution.

    Tu dois donc faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print(traitement(test))

  3. #3
    Membre averti Avatar de speedy_souris
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 47
    Par défaut
    salut VinsS,
    merci pour ta reponse rapide
    ca fonctionne bien !

    c'est un peu deroutant le retour d'un fonction a la place de son execution mais ce le principe du decorateur
    on l'apprend, on y pense mais en pratique cela reste encore flou
    est ce code peut être utiliser en prod tel quel ==> decorator dans une classe ?

  4. #4
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Ben non, pas vraiment, le décorateur est un mécanisme déjà implémenté en Python et son utilisation est plutôt celle-ci:
    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
    35
    36
    37
    38
    39
     
    from functools import wraps
     
    class Test:
        """teste les décorateurs de methode"""
        def __init__(self, nb1, nb2):
            """constructeur de la classe Test"""
            self.nb1 = nb1
            self.nb2 = nb2
     
        def decorator(func):
            @wraps(func)
            def _wrapped_func(*args):
                print(args)
                for i in (args[0].nb1, args[0].nb2):
                    if not isinstance(i, (int, float)):
                        raise ValueError("%s not a number" % i)
                return func(*args)
            return _wrapped_func
     
     
        def traitement(self):
            """additionne les deux nombre"""
            result = f"le resultat de l'opération {self.nb1} + {self.nb2} = {self.nb1+self.nb2}"
            return result
     
        @decorator
        def soustraction(self):
            result = f"le resultat de l'operation {self.nb1} - {self.nb2} = {self.nb1-self.nb2}"
            return result
     
    nb1 = 158
    nb2 = 17
    test = Test(nb1, nb2)
    traitement = test.traitement()
    print("Avant la décoration")
    print(traitement)
    print("Après la décoration")
    print(test.soustraction())
    Un décorateur n'est pas une simple méthode mais une méthode qui doit s'exécuter à l'appel, et juste avant, d'une autre méthode.

  5. #5
    Membre averti Avatar de speedy_souris
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 47
    Par défaut
    super !
    merci pour ces précieuse informations
    je vais bien étudier ça a tête reposer
    </speedy_souris>

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 11/03/2019, 09h23
  2. [Python 3.X] Appliquer un décorateur automatiquement à toutes fonctions et méthodes déclarées
    Par bistouille dans le forum Général Python
    Réponses: 9
    Dernier message: 19/04/2016, 10h10
  3. Décorateurs sur méthodes de classes
    Par fma38 dans le forum Général Python
    Réponses: 6
    Dernier message: 06/10/2015, 10h23
  4. Envoyer une méthode en argument d'un décorateur
    Par taxodium dans le forum Général Python
    Réponses: 6
    Dernier message: 30/11/2012, 09h18
  5. une méthode qui sert de décorateur
    Par sopsag dans le forum Général Python
    Réponses: 9
    Dernier message: 28/02/2010, 14h14

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