6

我在这里可能看起来很愚蠢。但是,我正在编写一些 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

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

我读过维基:装饰器模式和很好的答案如何制作函数装饰器链?(几乎全部)。

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

在 python 和设计模式方面有经验的人可以说是否故意创建 python 语义来创建装饰器模式?它是更多,更少,还是意味着不同的东西?

并且也许会阐明如何声明抽象方法或属性是如何装饰它的?

4

2 回答 2

9

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

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

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

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

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

于 2013-07-29T14:57:14.847 回答
5

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

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

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

于 2013-07-29T14:56:01.573 回答