python@decorator是否与decorator设计模式相关?

python@decorator是否与decorator设计模式相关?,python,design-patterns,decorator,Python,Design Patterns,Decorator,我在这里可能看起来很傻。然而,我正在编写一些python代码,这件事让我震惊。在python中有一些称为decorator的东西,它们由@表示,并使用“环绕”函数,如: class PlotABC(metaclass=ABCMeta): @property def figure(self): if self._figure is None: self.__create_figure() return self._figure @abstractmethod d

我在这里可能看起来很傻。然而,我正在编写一些python代码,这件事让我震惊。在python中有一些称为decorator的东西,它们由
@
表示,并使用“环绕”函数,如:

class PlotABC(metaclass=ABCMeta):

  @property
  def figure(self):
    if self._figure is None: self.__create_figure()
    return self._figure

  @abstractmethod
  def _prepare_series(self):
    pass
我也知道一些设计模式,我知道有一些模式叫做装饰器。有一次我想,“嘿,也许名字的相似性不是一个奇怪的巧合。”

我已经读过了,答案很好(几乎全部)

在我看来,python的decorator语义非常强大,可以用来实现设计模式。因为它们允许环绕函数和方法。尽管如此,我仍然感到困惑,因为我对设计模式缺乏经验。我也不知道有哪种语言为他们提供了这样一种专门的机制

有python和设计模式经验的人会说,python语义是否是特意创建装饰器模式的?是更多,更少,还是意味着不同

也许可以解释一下声明方法抽象或属性是如何修饰它的?

一个“模式”是一个缺少语言特性的解决方法。“装饰”是一个术语,它早在编程四人组模式书中就存在了——它被用来描述任何数量的操作,这些操作涉及到在其他内容上添加一些信息或行为

严格地说,这不是实现decorator模式的一种方式,因为它不涉及创建一个组成其他类的类(顺便说一句,这是使用decorator可以做的一件事)。然而,它确实与python的其他特性一起,使它在很大程度上过时了


实际上,我要补充的是,大多数“模式”是在C++、java等中伪造动态或反射行为的一种方式。在这些语言社区之外,你会发现几乎没有什么令人兴奋的事情。在Python中,decorators和元类提供了一种对各种转换进行编码的方法——我想,大多数不是普通代码的模式基本上都会被Python中特定的decorator或元类所取代

不,这不是一个奇怪的巧合,不,python@decorators没有实现GOF Decorator模式

GOF(四人帮,以《设计模式》一书的四位作者的名字命名)装饰者模式添加了“装饰”来改变对象的行为。它通过创建可应用于未修饰基类的“decorator”类来实现这一点

Python装饰程序向函数或类添加“装饰”。这些装饰器本质上是包装或修改函数/类的函数

两者的相似之处在于,您可以多次重复使用decorator来添加相同的功能,但是decorator模式要求decorator与您可以修饰的类一起设计


Python decorator只在任何一类函数上工作。

我不同意Python decorator将decorator模式过时的说法。我认为它们解决了不同的问题,尽管可能有一些重叠。@LennartRegebro好吧,我认为这取决于你是否认为实现给定模式的所有方法都是该模式。大多数模式归结为在变量为静态类型且多重继承存在问题(或被禁止)的环境中编写动态ish代码的方式。设计模式基于“模式语言”,最初适用于建筑和城市规划,因此,如果它们可以应用于Python或任何其他设计领域,我看不出它们不适用的理由。当然,GoF模式可能不太适合动态语言,但模式仍然应该适用于任何设计的东西。例如,MVC似乎经常在Python应用程序中使用。@建筑物的charlesross模式完全不同。MVC作为一种架构模式是很常见的,事实上,这是因为没有内置的语言特性使它不可见或不必要。。。还有更多。如果你从我的链接中看到这个问题,我觉得它们正是用来做装饰图案的。@luk32:我想说你的印象基本上是不正确的。当然,类装饰器和装饰器模式有一些重叠,但没有那么多。您可能可以完全替换它并不意味着这是一个好主意。:-)那么你会说,比问题的OP和1,6k被接受的答案更糟吗?或者我没有得到什么样的装饰(很可能)?顺便说一句,到目前为止,我得到了两个答案,我想说,这两个答案都在高讨论中,都有相同数量的赞成票。也许其他人会分享他们的观点。@luk32那篇文章不是关于装饰图案的。但是,我不会太担心这个问题,因为你会发现你很少需要考虑python中的模式。@Marcin我只是想象在
c++
中,这将很好地用装饰器实现。而且,老实说,我还没有达到这一点,尤其是看到这个问题和答案。也许我被一个不好的例子吸引了。可能是@Marcin的复制品我发誓我试着去搜索它,哈哈。我也会投票关闭我的复制品。