「Python裝飾器」和「裝飾器模式」有什麼區別?Python裝飾器和裝飾器模式有什麼區別?
什麼時候應該使用Python裝飾器,何時應該使用裝飾器模式?
我正在尋找Python裝飾器和裝飾模式實現相同的例子嗎?
@AcceptedAnswer
我知道Jakob Bowyer's answer是有效的。然而,Strikar的回答讓我明白了原因。
在Srikar的回答和研究給出資源後,我寫了這個例子,所以我可以看到和理解Python裝飾器和裝飾器模式。
我必須不同意與Strikar的「Python的裝飾都沒有裝飾圖案的實現」。在我學到的東西後,我堅信Python裝飾器是Decorator模式的實現。只是沒有經典的方式。
此外,我需要補充的是儘管Strikar說:「Python的裝飾在定義時函數和方法添加功能」 你可以很容易地使用Pytohon裝飾在運行時。
但是,我仍然將Stiker的答案標記爲已接受,因爲它幫助我理解了裝飾器模式的ImplementationPython。
"""
Testing Python decorators against Decorator Pattern
"""
def function(string):
return string
def decorator(wrapped):
def wrap(string):
# assume that this is something useful
return wrapped(string.upper())
return wrap
def method_decorator(wrapped):
def wrap(instance, string):
# assume that this is something useful
return wrapped(instance, string.upper())
return wrap
@decorator
def decorated_function(string):
print('! '.join(string.split(' ')))
class Class(object):
def __init__(self):
pass
def something_useful(self, string):
return string
class Decorator(object):
def __init__(self, wrapped):
self.wrapped = wrapped
def something_useful(self, string):
string = '! '.join(string.split(' '))
return self.wrapped().something_useful(string)
@method_decorator
def decorated_and_useful(self,string):
return self.something_useful(string)
if __name__ == '__main__':
string = 'Lorem ipsum dolor sit amet.'
print(function(string)) # plain functioon
print(decorator(function)(string)) # Python decorator at run time
print(decorated_function(string)) # Python decorator at definition time
a = Class()
print(a.something_useful(string)) # plain method
b = Decorator(Class)
print(b.something_useful(string)) # Decorator Pattern
print(b.decorated_and_useful(string)) # Python decorator decorated Decorator Pattern
@Srikar是正確的。 [Here](http://stackoverflow.com/q/3118929/146792)的另一個SO問題,你可能會覺得有趣! – mac
@Srikar,我不能接受Snswer,它不能解決Question中描述的問題,對不起,但是我的問題中提出的大多數解決方案都不起作用。 – seler
@seler夠公平的。 –