2017-09-28 5 views
0

En Python,Est-ce que les Décorateurs en Python doivent nécessairement implémenter le Motif Décorateur?

  1. Est-il exact que les décorateurs en Python peuvent changer l'interface de la fonction décorée/classe, par exemple changer la signature de la fonctions décorées et les méthodes de classe décorée? Par exemple:

    >>> def MyDecorator(func): 
    ...  def NewFunc(): 
    ...   pass 
    ...  return NewFunc 
    ... 
    >>> @MyDecorator 
    ... def MyFunc(a, b, c): 
    ...  print(a,b,c) 
    ... 
    
  2. Alors décorateurs en Python ne sont pas nécessairement utilisés pour la mise en œuvre du modèle de conception de décorateur tel que décrit dans le livre « Design Pattern » par GoF?

  3. Est-ce une mauvaise pratique d'écrire un décorateur qui modifie l'interface de la fonction décorée/classe?

Merci.

+0

Je pense que la question est bonne - mais trop large. Je veux dire que vous avez 3 questions (même si elles sont vaguement reliées) au lieu d'une seule. Pourriez-vous essayer de réduire la portée de la question? – MSeifert

+0

@MSeifert Merci. Les questions pour moi sont étroitement liées, et elles sont en fait la même question énoncée sous différentes formes. Si je les divise en trois postes, ils seront des doublons, j'en ai peur. – Tim

Répondre

1

De python.org (je souligne):

Le DecoratorPattern est un modèle décrit dans le DesignPatternsBook. Il s'agit d'une manière de modifier apparemment le comportement d'un objet, en l'encadrant à l'intérieur d'un objet de décoration avec une interface similaire.

Ce ne doit pas être confondue avec PythonDecorators, ce qui est une caractéristique de langue pour modifier dynamiquement une fonction ou une classe.

donc je suppose que les réponses à vos questions sont:

  1. Oui
  2. C'est exact
  3. Pas
+0

Merci. Quelles sont les bonnes utilisations des décorateurs en Python qui changent l'interface de la fonction/classe décorée? – Tim

+0

Un exemple du haut de ma tête: Dites que vous avez une fonction qui renvoie un objet de type A. Ensuite, vous réalisez que si cela fonctionne sur Linux, l'objet A est inadapté pour Windows, et il serait préférable d'utiliser l'objet de tapez plutôt B lorsque vous utilisez Windows. Donc, vous écrivez un décorateur qui vérifie le système d'exploitation actuel. Si c'est Windows, il modifie la valeur retournée pour être de type B au lieu de A. – asherbar

1

Vous pouvez également trouver des réponses dans le Python bien connu decorator documentation de la bibliothèque.

mentionnant la Introduction:

Techniquement parlant, tout objet de python qui peut être appelé avec un argument peut être utilisé comme un décorateur. Cependant, cette définition est un peu trop grande pour être vraiment utile. Il est plus commode de diviser la classe générique de décorateurs en deux sous-classes:

décorateurs préservant signature:

objets appelables qui acceptent une fonction en entrée et renvoient une fonction en sortie, avec la même signature.

décorateurs de changement de signature:

décorateurs qui modifient la signature de leur fonction d'entrée ou de décorateurs qui renvoient des objets non appelable.

Les décorateurs à changement de signature ont leur utilisation: par exemple, les classes internes staticmethod et classmethod font partie de ce groupe. Ils prennent des fonctions et retournent des objets descripteurs qui ne sont ni des fonctions, ni des appelables.

Encore, les décorateurs de signature-préservation sont plus communs, et plus faciles à raisonner. En particulier, ils peuvent être composés ensemble, alors que d'autres décorateurs ne le peuvent généralement pas.

réponses: Mêmes

  1. Oui
  2. C'est exact
  3. Pas