Whats the difference between Python decorators and Decorator Pattern?

Whats the difference between “Python decorators” and the “decorator pattern”?

When should I use Python decorators, and when should I use the decorator pattern?

I'm looking for examples of Python decorators and the decorator pattern accomplishing same? @AcceptedAnswer I now that Jakob Bowyer's answer is valid. Yet is's Strikar's answer that made me understand why. After Srikar's answer and studying given resources I've written this example, so I can visualize and understand Python decorators and Decorator Pattern.

I must disagree with Strikar's "Python decorators are not an implementation of the decorator pattern". After what I've learned I'm strongly convinced that Python decorators are implementation of Decorator Pattern. Just not in the classic way.

Also, I need to add that despite the fact that Strikar said "Python decorators add functionality to functions and methods at definition time" you can easily use Pytohon decorators at run time.

Yet, I still mark Stiker's answer as accepted, because it helped me understand Implementation of Decorator Pattern in Python.

"""
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

Answers


Decorator Pattern - In object-oriented programming, the decorator pattern is a design pattern that allows behaviour to be added to an existing object dynamically. The decorator pattern can be used to extend (decorate) the functionality of a certain object at run-time, independently of other instances of the same class, provided some groundwork is done at design time.

Decorators in Python - Despite the name, Python decorators are not an implementation of the decorator pattern. The decorator pattern is a design pattern used in statically typed object-oriented programming languages to allow functionality to be added to objects at run time; Python decorators add functionality to functions and methods at definition time, and thus are a higher-level construct than decorator-pattern classes. The decorator pattern itself is trivially implementable in Python, because the language is duck typed, and so is not usually considered as such. So in Python a decorator is any callable Python object that is used to modify a function, method or class definition.

I hope i made the difference clear. Just in case you did not completely understand, please go through these links. You will come out more than clear at the end of it -

Understanding Python decorators

Implementing the decorator pattern in Python

What is the difference between using decorators and extending a sub class by inheritance?

Python Class Decorator

PyWiki - Python Decorators - A detailed discourse

Python Decorators Made Easy

source1 & source2


Need Your Help

How to divide each pixel calculation of Mandelbrot into different nodes?

c++ c multithreading parallel-processing mandelbrot

My question here is what data structure should I use to distribute the work to each threads and get the calculated value from them. First thing in my mind is fill vector[0] .. vector[63999] (for

Android horizontal indeterminate progress bar lollipop

android progress-bar android-5.0-lollipop material-design

I have implemented a horizontal indeterminate progress bar in my Android application. I am building and running the app on lollipop (v22), so using their styles.

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.