2013-07-29 92 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