В чем разница между «Python decorators» и «шаблоном декоратора»?
Когда я должен использовать декораторы Python и когда я должен использовать шаблон декоратора?
Я ищу примеры декораторов Python и шаблонов декораторов, выполняющих то же самое.
@ AcceptedAnswer
Я знаю, что Ответ Якоба Бойера действителен. И все же именно ответ Срикара заставил меня понять, почему.
После ответа Срикара и изучения данных ресурсов я написал этот пример, чтобы я мог визуализировать и понимать декораторы Python и шаблон декоратора.
Я должен не согласиться со словами Срикара " Python-декораторы не являются реализацией шаблона декоратора ". После того, что я узнал, Я твердо убежден, что декораторы Python являются реализацией шаблона декоратора. Просто не в классическом смысле.
Также , мне нужно добавить, что, несмотря на то, что Срикар сказал « Python-декораторы добавляют функциональность к функциям и методам во время определения », вы можете легко использовать Python декораторы во время выполнения .
Тем не менее, я все еще отмечаю ответ Срикара как принятый, потому что он помог мне понять реализацию шаблона декоратора в 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