What’s New ?

The Top 10 favtutor Features You Might Have Overlooked

Read More

Python Decorators Explained (with Examples)

  • Sep 05, 2023
  • 6 Minute Read
  • Why Trust Us
    We uphold a strict editorial policy that emphasizes factual accuracy, relevance, and impartiality. Our content is crafted by top technical writers with deep knowledge in the fields of computer science and data science, ensuring each piece is meticulously reviewed by a team of seasoned editors to guarantee compliance with the highest standards in educational content creation and publishing.
  • By Abrar Ahmed
Python Decorators Explained (with Examples)

In this article, we will delve into the world of Python decorators, its examples, and the different types of decorators available. They provide a clean way to add additional behaviors or wrap existing functions with additional logic. 

What is a Python Decorator?

A Python decorator is a special construct that allows you to modify the behavior of functions or classes by wrapping them in another function. Decorators are denoted by the `@decorator_name` syntax placed immediately before the function or class definition.

When a decorated function or class is called, it is actually invoking the decorator function, which can modify the input, output, or behavior of the decorated object.

It is a powerful and flexible feature that allows you to enhance the behavior of functions without changing its code. They are often used to add functionality to functions or methods, such as logging, authentication, caching, or input validation.

Let's consider a simple example to demonstrate their usage:

def uppercase_decorator(func):
    def wrapper():
        original_result = func()
        modified_result = original_result.upper()
        return modified_result
    return wrapper

@uppercase_decorator
def say_hello():
    return "Hello, World!"

print(say_hello())

 

In this example, we define a decorator called `uppercase_decorator`. It takes a function as an argument and returns a wrapper function. The wrapper function modifies the result of the original function by converting it to uppercase.

We then decorate the `say_hello` function with the `@uppercase_decorator` syntax. When we call `say_hello()`, the decorator is invoked, and the returned wrapper function modifies the result before returning it.

Why Use Python Decorators?

Python decorators offer several benefits and can significantly enhance your code in various ways:

  • Code Reusability: Decorators allow you to separate cross-cutting concerns or common functionalities and apply them to multiple functions or classes. This promotes code reusability.
  • Functionality Extension: Decorators enable you to add new features to existing functions without modifying their source code. This makes it easy to extend functionality without disturbing the original implementation.

However, decorators also have some limitations. Since decorators modify the behavior of functions, the modified functionality may not be immediately visible in the function or class definition. This can make it harder to understand the complete behavior of a decorated object. It also makes the debugging process a little more challenging.

Decorator with Arguments

Decorators can also accept arguments, allowing for more flexibility and customization. Here's an example of a decorator with arguments:

def repeat_decorator(num_times):
    def decorator(func):
        def wrapper():
            for _ in range(num_times):
                func()
        return wrapper
    return decorator

@repeat_decorator(3)
def greet():
    print("Hello!")

greet()

 

In this example, we define a decorator called `repeat_decorator` that takes an argument `num_times`. The `repeat_decorator` returns a decorator function that takes the function to be decorated and returns a wrapper function.

The wrapper function calls the original function multiple times based on the `num_times` argument. By using the `@repeat_decorator(3)` syntax, we apply the decorator to the `greet` function, causing it to be executed three times when called.

Different Types of Decorators in Python

In Python, there are different types of decorators based on their application and behavior. Some common types include:

  1. Function Decorators: These decorators are applied to functions and modify their behavior or extend their functionality.
  2. Class Decorators: Class decorators are used to modify the behavior or structure of classes. They can add or modify class-level attributes, methods, or inheritance.
  3. Method Decorators: Method decorators are specifically used to modify the behavior of individual methods within a class.
  4. Property Decorators: Property decorators are used to define special methods, such as getters, setters, or deleters, for class properties.

Can We Have Multiple Decorators?

Yes, it is possible to have multiple decorators applied to a single function or class in Python. Multiple decorators are applied from top to bottom, with the top decorator being the outermost layer. Each decorator provides additional functionality or modifications to the decorated object.

Here's an example demonstrating multiple decorators:

def decorator1(func):
    def wrapper():
        print("Decorator 1")
        func()
    return wrapper

def decorator2(func):
    def wrapper():
        print("Decorator 2")
        func()
    return wrapper

@decorator1
@decorator2
def greet():
    print("Hello!")

greet()

 

In this example, the `greet` function is decorated with both `decorator1` and `decorator2`. When `greet()` is called, the output will be:

Decorator 1
Decorator 2
Hello!

 

The decorators are applied in the order they are listed, with `decorator1` being the outermost layer and `decorator2` being the innermost layer.

Conclusion

Overall, Python decorators are great for code reusability, extend functionality, and promote clean code organization. For more in-depth knowledge, connect with our top Python Tutors online, they can teach you this complex topic for you to better understand it. 

FavTutor - 24x7 Live Coding Help from Expert Tutors!

About The Author
Abrar Ahmed
An ambivert individual with a thirst for knowledge and passion to achieve. Striving to connect Artificial Intelligence in all aspects of life. I am also an avid coder and partake in coding challenges all the time on Leetcode and CodeChef.