“Python装饰器”和“装饰器模式”有什么区别?
何时应该使用Python装饰器,何时应该使用装饰器模式?
我正在寻找Python装饰器和装饰器模式实现相同的例子。
@AcceptedAnswer
我知道Jakob Bowyer的答案是有效的。然而,正是Srikar的答案让我明白了为什么。
在阅读了Srikar的回答并学习了给定的资源后,我编写了这个例子,以便我可以可视化和理解Python装饰器和装饰器模式。
我必须不同意Srikar的“Python装饰器不是装饰器模式的一种实现”。根据我的学习,我坚信Python装饰器是装饰器模式的一种实现。只是不是经典方式。
另外,我需要补充的是,尽管Srikar说“Python装饰器在定义时向函数和方法添加功能”,但你也可以轻松地在运行时使用Python装饰器。
然而,我仍然将Srikar的答案标记为已接受,因为它帮助我理解了Python中装饰器模式的实现。
"""
Testing Python decorators against the 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 function
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 the decorator pattern