Programming with python: Decorators

Reading Time : ~ .

Python decorators support aspect-oriented programming. It is used to add or modify the code in functions or classes. Using decorators will provide security, tracing, looking etc Let see an example:

@fundecorator
def myfunc():
print "This is my function"

The above example has a function myfunc() with a decorator @fundecorator. The symbol @ tell that the type of the name is a decorator. Some points regarding decorators: -- Decorators can be function or class -- The class that is used as a decorator must implement __call__ -- In a class, decorator  arguments are optional whereas a function decorator must have arguments. Decorators are of two types: 1. Class decorators: - In this, we use class as a decorator to decorate functions/classes. For example:

>>> class mydecorator(object):
...   def __init__(self, f):
...     self.f = f
...   def __call__(self):
...     print "Start of", self.f.__name__
...     self.f()
...     print "End of", self.f.__name__
...
>>> @mydecorator
... def func1():

...   print "This is function 1"
...
>>> @mydecorator
... def func2():
...   print "This is function 2"
...

The output is:

>>> func1()
Start of func1
This is function 1
End of func1
>>> func2()
Start of func2
This is function 2
End of func2

Class decorators without arguments: The above example is considered under this category. There are no decorator arguments in __init__. So the control is passed to the constructor f() which will take the function to be decorated as input. __call__ will be invoked only after the decorated function is called. Class decorators with arguments: These are the class decorators which take input arguments. For example:

#decorators.py
class mydecorator(object):
def __init__(self, arg1, arg2, arg3):
self.arg1 = arg1
self.arg2 = arg2
self.arg3 = arg3
def __call__(self, f):
def sum_of_args(*args):
print("Decorator arguments:", self.arg1, self.arg2, self.arg3)
f(*args)
print("Sum of decorator arguments: ", (self.arg1+self.arg2+self.arg3))
return sum_of_args

@mydecorator(5, 10, 15)
def sayHello(a1, a2, a3, a4):
print('sayhello() arguments:', a1, a2, a3, a4)

print("Calling sayHello()")
sayHello("say", "hi", "hello", "world")

The output for the above program will be:

~$ python decorators.py
Calling sayHello()
('Decorator arguments:', 5, 10, 15)
('sayhello() arguments:', 'say', 'hi', 'hello', 'world')
('Sum of decorator arguments: ', 30)

2. Function decorators:- In this we use function as decorator to decorate functions/classes. For example:

>>> def mydecorator(f):
...   def myfun():
...     print "Start of", f.__name__
...     f()
...     print "End of", f.__name__
...   myfun.__name__ = f.__name__
...   return myfun
...
>>> @mydecorator
... def func1():
...   print "This is function 1"
...
>>> @mydecorator
... def func2():
...   print "This is function 2"
...

The output will be same as the output for Type 1.

    By Posted On
SENIOR DEVELOPER at MICROPYRAMID

Need any Help in your Project?Let's Talk

Latest Comments
Related Articles
Integrate Twitter Social API into Django App Swetha Naretla

Integrating Twitter sign in (OAuth) in Django App, which includes
1. Capturing username via Twitter Login
2. Updating authenticated user current status on twitter(tweets).

Continue Reading...
Sending SMS, MMS using Twilio. Chaitanya Kattineni

A simple Tutorial on sending SMS and MMS in python using Twilio. In this tutorial you will learn how to send SMS, MMS and checking ...

Continue Reading...
Getting Started with the IPython Notebook Shirisha Gaddi

IPython is a set of tools developed to make it easier for the programmers to work with Python and data. IPython provides extensions to the ...

Continue Reading...

Subscribe To our news letter

Subscribe to our news letter to receive latest blog posts into your inbox. Please fill your email address in the below form.
*We don't provide your email contact details to any third parties