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

问题描述:

在Python,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. 编写修饰装饰函数/类的接口的装饰器是不好的做法吗?

谢谢。

+0

我认为这个问题是好的 - 但过于宽泛。我的意思是你有3个问题(即使他们是松散连接)而不是一个。你能否试图缩小问题的范围? – MSeifert

+0

@MSeifert谢谢。对我的问题是密切相关的,而且他们实际上是以不同形式陈述的同一个问题。如果我把它们分成三个帖子,我恐怕会重复。 – Tim

python.org(我的强调):

的DecoratorPattern处于DesignPatternsBook描述的图案。 这是一种明显修改对象行为的方式,通过将 包含在具有类似接口的装饰对象中。

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

所以我猜这个问题的答案是:

  1. 这是正确的
  2. 没有
+0

谢谢。在Python中修饰装饰函数/类的接口的装饰器有什么好用处? – Tim

+0

从我的头顶开始的一个例子:假设你有一个函数返回一个类型为A的对象。然后你意识到,虽然这对Linux有效,但对象A不适合Windows,并且最好使用在Windows上运行时键入B.所以你写一个装饰器来检查当前的操作系统。如果它是Windows,它会将返回的值修改为类型B而不是A. – asherbar

您还可以找到一些答案在著名的Python decorator库文档。

引述Introduction

从技术上讲,它可以与一个参数调用任何Python对象可以被用作装饰。但是,这个定义有点太大而不能真正有用。这是更方便分裂泛型类装饰的两个子类:

签名保留装饰:它接受一个函数作为输入,并返回一个函数作为输出,具有相同签名

调用对象。

签名变化的装饰:

装修改变它们的输入功能的签名,或装饰器返回非可调用的对象。

签名变化的装饰器有它们的用途:例如,内置类staticmethod和classmethod在这个组中。它们接受函数并返回既不是函数又不可调用的描述符对象。

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

相同的答案:

  1. 这是正确的
  2. 没有