В чем разница между декораторами Python и шаблоном декоратора?

В чем разница между "декораторами Python" и "паттерном декоратора"?

Когда следует использовать декораторы Python, а когда - паттерн декоратора?

Я ищу примеры декораторов Python и паттерна декоратора, достигающих одного и того же.

@AcceptedAnswer

Я знаю, что ответ Jakob Bowyer верен. Однако именно ответ Шрикара помог мне понять, почему.

После ответа Шрикара и изучения данных ресурсов я написал этот пример, чтобы визуализировать и понять декораторы 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

23
задан leewz 17 July 2019 в 15:22
поделиться