Python中的装饰器是否必须实现装饰器模式?

时间:2017-09-28 12:01:05

标签: python python-3.x design-patterns

在Python中,

  1. Python中的装饰器可以改变它的接口是否正确 装饰的功能/类,例如改变签名 装饰类的装饰功能和方法?例如:

    >>> def MyDecorator(func):
    ...     def NewFunc():
    ...         pass
    ...     return NewFunc
    ... 
    >>> @MyDecorator
    ... def MyFunc(a, b, c):
    ...     print(a,b,c)
    ...
    
  2. 所以Python中的装饰器不一定用于实现装饰设计模式,如GoF的“设计模式”一书所述?

  3. 编写一个改变装饰函数/类接口的装饰器是不好的做法?

  4. 感谢。

2 个答案:

答案 0 :(得分:1)

来自python.org(我的重点):

  

DecoratorPattern是DesignPatternsBook中描述的模式。   这是一种通过封闭来明显修改对象行为的方法   它在具有类似界面的装饰物体内。

     

这不要与PythonDecorators 混淆,后者是一种语言   动态修改函数或类的功能。

所以我猜你问题的答案是:

  1. 这是正确的
  2. 没有

答案 1 :(得分:1)

您还可以在众所周知的Python decorator库文档中找到一些答案。

引用Introduction

  

从技术上讲,任何可以用一个参数调用的Python对象都可以用作装饰器。但是,这个定义有点太大而无法真正有用。在两个子类中拆分泛型类的装饰器更方便:

     

签名保留装饰器:

     

可调用对象,它接受函数作为输入并将函数作为输出返回,具有相同的签名。

     

签名更改装饰器:

     

改变输入函数签名的装饰器,或返回不可调用对象的装饰器。

     

签名更改装饰器有其用途:例如,内置类staticmethod和classmethod都在此组中。它们接受函数并返回既不是函数也不是callables的描述符对象。

     

仍然,签名保留装饰器更常见,更容易推理。特别是,它们可以组合在一起,而其他装饰者通常不能。

同样的答案:

  1. 那是对的
  2. 没有