我在这看起来似乎很愚蠢。但是,我正在写一些python代码,这件事让我感到震惊。在python中有一些叫做装饰器的东西,用@
表示并用于“around”函数,如:
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语义来创建装饰模式?它是更多,更少,还是意味着不同的东西?
并且可能会说明如何声明方法摘要或属性是否正在装饰它?
答案 0 :(得分:6)
不,这不是一个奇怪的巧合,不,python @decorators没有实现GOF Decorator模式。
GOF(Gang of Four,以“Design Patterns”一书的四位作者命名)装饰图案添加了“装饰”来改变对象的行为。它通过创建可以应用于未修饰的基类的“装饰器”类来实现。
Python装饰器为函数或类添加“装饰”。这些装饰器本质上是包装或修改函数/类的函数。
两者的相似之处在于您可以重复使用装饰器多次添加相同的功能,但装饰器模式要求装饰器与您可以装饰的类一起设计。
Python装饰器只是在任何类函数上完成它们的工作。
答案 1 :(得分:4)
“模式”是缺少语言功能的变通方法。 “装饰”这个术语在编程中预先存在了Gang of Four模式书 - 它已经被用来描述任何涉及在其他东西上添加一些信息或行为的操作。
严格来说,这不是实现装饰器模式的一种方式,因为它不涉及创建一个组成其他类的类(除了偶然的,这是你可以用装饰器做的一件事) 。但是,它与python的其他功能一起使用,使其基本上过时了。
事实上,我补充说,大多数“模式”是伪造C ++,Java等动态或反射行为的一种方式。除了那些语言社区之外,你会发现很少兴奋。在Python中,装饰器和元类提供了一种对各种变换进行编码的方法 - 我猜想大多数不是普通代码的模式基本上都被Python中的特定装饰器或元类替换。