【问题标题】:Is python @decorator related to the decorator design pattern?python @decorator 与装饰器设计模式有关吗?
【发布时间】:2013-07-29 14:49:09
【问题描述】:

我在这里可能看起来很愚蠢。但是,我正在编写一些 python 代码,这件事让我印象深刻。在 python 中,有一些称为装饰器的东西,用@ 表示,并使用“环绕”函数,例如:

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

我也知道一些设计模式,而且我知道有一些模式叫做装饰器。然后有一次我想,“嘿,也许名字相似并不是一个奇怪的巧合。”

我已阅读 wiki: Decorator pattern 和出色的答案 How to make a chain of function decorators?(几乎全部)。

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

是否有 Python 和设计模式方面经验丰富的人可以说,如果有意创建 Python 语义来创建装饰器模式?是更多,更少,还是意味着不同?

也许可以说明声明抽象方法或属性是如何装饰它的?

【问题讨论】:

标签: python design-patterns decorator


【解决方案1】:

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

GOF(Gang of Four,以“设计模式”一书的四位作者的名字命名)装饰器模式添加“装饰”来改变对象的行为。它通过创建可应用于未装饰基类的“装饰器”类来做到这一点。

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

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

Python 装饰器只是在任何类的函数上工作。

【讨论】:

  • 我觉得它们可以用于同一件事......等等。如果您从我的链接中查看问题,在我看来,就像它们恰好用于装饰器模式的用途一样。
  • @luk32:我想说你的印象在很大程度上是不正确的。类装饰器和装饰器模式绝对有一些重叠,但没有那么多。您可能可以完全替换它并不意味着它是一个好主意。 :-)
  • 那么你会说,stackoverflow.com/questions/739654/… 问题的 OP 和 1,6k 接受的答案滥用了它吗?或者我没有得到装饰是什么(很可能)?顺便说一句,到目前为止,我得到了 2 个答案,我想说,这两个答案都具有相同的赞成票数。也许其他人会分享他们的观点。
  • @luk32 那篇文章不是关于装饰器模式的。但是,我不会太担心这个问题,因为你会发现你很少需要考虑 python 中的模式。
  • @Marcin 我只是想象在c++ 中这将通过装饰器很好地实现。另外,老实说,我没有达到这一点,尤其是看到这个问题和答案。也许我被一个坏例子所吸引。
【解决方案2】:

“模式”是缺少语言功能的解决方法。 “装饰”是编程中“四人组”模式书中预先存在的一个术语 - 它已被用于描述任何数量的操作,这些操作涉及将一些信息或行为添加到其他东西上。

严格来说,这不是一种实现装饰器模式的方法,因为它不涉及创建一个组成其他类的类(除了巧合的是,这是你可以用装饰器做的一件事) .然而,它与 python 的其他特性一起,使它在很大程度上已经过时了。

事实上,我要补充的是,大多数“模式”都是在 C++、Java 等中伪造动态或反射行为的一种方式。在这些语言社区之外,您几乎不会感到兴奋。在 Python 中,装饰器和元类提供了一种对各种转换进行编码的方法——我猜想大多数不是微不足道的代码的模式都会被 Python 中的特定装饰器或元类所取代。

【讨论】:

  • 我不同意 python 装饰器使装饰器模式过时。我认为它们解决了不同的问题,尽管可能有一些重叠。
  • @LennartRegebro 好吧,我认为这取决于您是否认为完成给定模式的所有方法都是该模式。大多数模式归结为在变量是静态类型的环境中编写动态代码的方法,并且多重继承是有问题的(或被禁止的)。
  • 设计模式基于“一种模式语言”,最初适用于建筑和城市规划,所以如果它们可以适用,我看不出它们为什么不适用于 Python 或任何其他设计事物的领域。当然,GoF 模式可能不太适合动态语言,但模式仍然应该适用于任何设计的东西。例如,MVC 似乎经常用于 Python 应用程序中。
  • @charlesross 建筑物的模式完全不同。 MVC 作为一种架构模式很常见,这实际上是因为没有内置的语言特性使其不可见或不必要。
猜你喜欢
  • 2019-02-23
  • 2013-11-28
  • 2012-09-04
  • 2010-10-05
  • 1970-01-01
  • 2017-08-01
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多