2013-07-29 39 views
3

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

我也知道的设计模式条子,我知道有图案装饰叫。然后,一旦我想,“嘿,也许名称相似性不是一个奇怪的巧合。”

我已阅读wiki: Decorator pattern和伟大的答案How to make a chain of function decorators?(几乎整个)。

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

可能有人经历了Python和设计模式说,如果蟒蛇语义被刻意营造创建装饰图案?它是更多,更少,还是意味着不同的东西?

也许抛出一些光如何声明一个抽象方法或属性的装饰呢?

+0

[Python装饰器与装饰器模式有什么区别?](http:// stackoverflow。com/questions/8328824/python-decorators-and-decorator-pattern之间的差异) – Marcin

+0

@Marcin我发誓我试图寻找它,哈哈。我也会投票结束我的重复。 – luk32

回答

5

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

的GOF(四人帮,这本书的四位作者,故得名“设计模式”)Decorator模式增加了“装饰品”,以改变对象的行为。它通过创建可应用于未装饰基类的“装饰器”类来实现此目的。

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

两者都很相似,因为您可以重复使用装饰器多次添加相同的功能,但装饰器模式要求装饰器与您可以装饰的类一起设计。

Python装饰器反而只是在任何类的函数上做他们的工作。

+0

我有这种感觉,他们可以用于相同的事情...等等。如果你从我的链接看问题,我认为,就像他们正在使用什么样的装饰模式一样。 – luk32

+0

@ luk32:我想说你的印象很大程度上是不正确的。类装饰器和装饰器模式有一些重叠,但绝非如此。你可能*可以*完全替代它并不意味着这是一个好主意。 :-) –

+0

所以你会说,比OP的问题http://stackoverflow.com/questions/739654/how-can-i-make-a-chain-of-function-decorators-in-python/1594484 #1594484和1,6k接受的答案滥用了它吗?或者我没有得到什么装饰(很可能)?顺便说一句,到目前为止,我得到了两个答案,我想说,这两个答案都是以高票数进行的。也许别人会分享他们的观点。 – luk32

4

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

严格地说,这不是实现装饰器模式的一种方式,因为它不涉及创建一个组成其他类的类(除了偶然的情况,这是一件你可以用装饰器)。但是,它确实与python的其他功能一起,使其在很大程度上已经过时。

其实,我想补充一点,最“模式”是在C++,Java的动态伪造或反射行为的一种方式,等等。在这些语言社区之外,你会发现很少兴奋。在Python装饰器和元类中提供了一种编码各种转换的方法 - 我猜想大多数不是普通代码的模式大部分被Python中的特定装饰器或元类取代。

+0

我不同意Python装饰器渲染装饰器模式过时。我认为他们解决了不同的问题,尽管可能会有一些重叠。 –

+0

@LennartRegebro嗯,我认为这取决于你是否认为完成给定模式所做的所有方式都是这种模式。大多数模式归结为在变量是静态类型的环境中编写动态代码的方式,并且多重继承有问题(或禁止)。 – Marcin