Quelle est la différence entre les décorateurs Python et le motif décorateur?

Quelle est la différence entre "décorateurs Python" et le "motif décorateur"?

Quand devrais-je utiliser des décorateurs Python, et quand devrais-je utiliser le motif de décorateur?

Je cherche des exemples de décorateurs Python et le modèle de décorateur accomplissant la même chose.

@AcceptedAnswer

Je sais que la réponse DE Jakob Bowyer est valide. Pourtant, C'est la réponse de Strikar qui m'a fait comprendre pourquoi.

Après la réponse de Srikar et l'étude donnée ressources j'ai écrit cet exemple, afin que je puisse visualiser et comprendre les décorateurs Python et le modèle de décorateur.

Je dois être en désaccord avec les " décorateurs Python ne sont pas une implémentation du modèle de décorateur"de Strikar. Après ce que j'ai appris je suis fortement convaincu que les décorateurs Python implémentent le modèle de décorateur. juste pas de la manière classique.

Aussi , je dois ajouter que malgré le fait que Strikar a dit " les décorateurs Python ajoutent des fonctionnalités aux fonctions et méthodes au moment de la définition" Vous pouvez facilement utiliser des décorateurs Python au moment de l'exécution .

Pourtant, je marque toujours la réponse de Stiker comme acceptée, parce que cela m'a aidé à comprendre la mise en œuvre du motif de décorateur en Python .

"""
Testing Python decorators against the decorator pattern
"""
def function(string):
    return string

def decorator(wrapped):
    def wrap(string):
        # Assume that this is something useful
        return wrapped(string.upper())
    return wrap

def method_decorator(wrapped):
    def wrap(instance, string):
        # Assume that this is something useful
        return wrapped(instance, string.upper())
    return wrap

@decorator
def decorated_function(string):
    print('! '.join(string.split(' ')))

class Class(object):
    def __init__(self):
        pass
    def something_useful(self, string):
        return string

class Decorator(object):
    def __init__(self, wrapped):
        self.wrapped = wrapped
    def something_useful(self, string):
        string = '! '.join(string.split(' '))
        return self.wrapped().something_useful(string)

    @method_decorator
    def decorated_and_useful(self,string):
        return self.something_useful(string)


if __name__ == '__main__':
    string = 'Lorem ipsum dolor sit amet.'
    print(function(string))                  # Plain function
    print(decorator(function)(string))       # Python decorator at run time
    print(decorated_function(string))        # Python decorator at definition time
    a = Class()
    print(a.something_useful(string))        # Plain method
    b = Decorator(Class)
    print(b.something_useful(string))        # Decorator pattern
    print(b.decorated_and_useful(string))    # Python decorator decorated the decorator pattern
21
demandé sur Peter Mortensen 2011-11-30 19:53:07

3 réponses

Motif décorateur - en programmation orientée objet, le motif Décorateur est un motif de conception qui permet d'ajouter dynamiquement un comportement à un objet existant. Le décorateur modèle peut être utilisé pour étendre (décorer) la fonctionnalité d'un objet au moment de l'exécution, indépendamment des autres instances de la même classe, à condition que certaines bases se fait au moment de la conception.

Décorateurs en Python - malgré le nom, les décorateurs Python ne sont pas une implémentation de le pattern décorateur. Le modèle de décorateur est un modèle de conception utilisé dans les langages de programmation orientés objet typés statiquement pour permettre l'ajout de fonctionnalités aux objets au moment de l'exécution; les décorateurs Python ajoutent des fonctionnalités aux fonctions et aux méthodes au moment de la définition, et sont donc une construction de niveau supérieur à celui des classes de modèle de décorateur.

Le motif de décorateur lui-même est trivialement implémentable en Python, car le langage est typé duck, et n'est donc généralement pas considéré comme tel. Si en Python, un décorateur est tout objet Python appelable utilisé pour modifier une fonction, une méthode ou une définition de classe.

J'espère avoir fait la différence. Juste au cas où vous ne compreniez pas complètement, veuillez passer par ces liens. Vous sortirez plus que clair à la fin de celui-ci -

25
répondu Srikar Appalaraju 2018-05-20 12:56:05

La différence est la suivante:

(a) les décorateurs Python sont liés à une méthode existante et modifient le comportement de cette méthode. Exemple:

@modifyBehavior
def original(myString):
    print myString

Le comportement de l'original est écrasé. Vous ne pouvez pas l'utiliser pour ajouter une nouvelle fonctionnalité.

(B) motif Décorateur est sur le polymorphisme. Dans votre exemple de code ci-dessus, le comportement du décorateur.something_useful est écrasé. La méthode originale est perdue. Ce n'est pas vraiment un motif de décorateur. Vous devriez chercher à améliorer ou ajouter des fonctionnalités, pas remplacer une méthode. Vous devez vous assurer que A. something_useful (string) retourne la même chose que B. something_useful (string). En fait, dans décorateur motif typiquement remplacer l'objet d'origine. Voici ce que je veux dire:

class Class(object):
    def __init__(self):
        pass
    def something_useful(self, string):
        return string

class Decorator(object):
    def __init__(self, wrapped):
        self._wrapped = wrapped
    def withUnderscores(self, string):
        return '_'.join(string.split(' '))
    def __getattr__(self, name):
        return getattr(self._wrapped, name)


if __name__ == '__main__':
    string = 'Lorem ipsum dolor sit amet.'
    obj = Class()
    print('Original: ', obj.something_useful(string))
    #This has no underscore function.  Use decorator to add.
    obj = Decorator(obj)
    print('Replaced spaces: ', obj.withUnderscores(string))
    print('Original still works: ', obj.something_useful(string))

, Vous pouvez avoir plusieurs décorateurs pour ajouter des fonctionnalités. Cela vous permet d'ajouter uniquement ce dont vous avez besoin quand vous en avez besoin. Plus de lecture: GoF

1
répondu rfportilla 2017-05-08 22:58:14

Les décorateurs en Python sont l'application de décorateurs dans la conception de décorateurs.

Ils sont tous les deux la même chose. L'un parle de la mise en œuvre du langage et l'autre d'un concept de conception et d'informatique.

0
répondu Jakob Bowyer 2018-05-20 12:53:22