Understanding Python Decorators and How to Use Them

Are you ready to take your python programming skills to the next level? Do you want to explore the powerful functionality of Python through decorators? Look no further because in this article, we are going to take a deep dive into "Python decorators" and how to use them to write cleaner and more efficient code.

What are Python Decorators?

Python decorators are a way of wrapping functions or classes to add extra functionalities - this might include caching, timing, logging, or prohibiting access to certain parts of the code. Essentially, decorators are functions that accept other functions as arguments, wraps them with some additional functionality, and then returns the modified function.

Decorators are represented in Python with the symbol "@", followed by the name of the function that provides the functionality (i.e @decorator_fn). A function where a decorator is applied is called a "decorated function".

How Do Python Decorators Work?

Python decorators work by taking advantage of the fact that functions in Python can be treated as objects, just like any other data value.

When you apply a decorator to a function, Python takes the original function and passes it as an argument to the decorator function. Essentially, the decorator function becomes a "wrapper" or "envelope" for the original function - the decorator adds extra code around the original function to enhance or modify its behaviour.

Types of Decorators in Python

There are three different types of decorators in Python:

  1. Function decorators
  2. Class decorators
  3. Method decorators

Function Decorators

Function decorators are the most common type of Python decorators. When you apply a function decorator to a function, it modifies the behaviour of the function.

Here's an example of a function decorator:

def greet_decorator(f):
    def wrapper(*args, **kwargs):
        print("Hello, world!")
        f(*args, **kwargs)
        print("Goodbye, world!")
    return wrapper

def greet():
    print("I'm saying hello...")


In this example, we've created a "greet_decorator" function that takes a function "f" as an argument, and then returns a new function "wrapper". The "wrapper" function does a little bit of extra work by printing "Hello, world!" before executing the original function "f", and printing "Goodbye, world!" afterwards. Finally, the "wrapper" function is returned.

The @greet_decorator annotation is used to apply the "greet_decorator" function to the "greet" function. So when you call "greet()", it is really calling the modified function, which prints "Hello, world!" first, then calls the original "greet" function, and then prints "Goodbye, world!".

Class Decorators

Class decorators are essentially the same as function decorators, but instead of modifying the behaviour of a function, they modify the behaviour of a class.

Here's an example of a class decorator:

def readonly(cls):
    def wrapper(*args):
        raise TypeError('This is a readonly class')
    for name in cls.__dict__:
        if not name.startswith('__'):
            setattr(cls, name, property(wrapper))
    return cls

class MyClass:
    my_property = 'Hello World!'
    def my_method(self):
        return 'Hello World!'

    def my_other_method(self):
        return 'Goodbye!'

my_class = MyClass()

In this example, we've created a "readonly" class decorator function that takes a class "cls" as an argument, and then returns the original class with some modifications. The decorator function creates a new function called "wrapper" that raises a TypeError if the user tries to set an attribute on the class, and sets all the attributes of the class as read-only by wrapping them with the "property" function.

The "@readonly" annotation is used to apply the decorator to the "MyClass" class, essentially making it a read-only class.

Method Decorators

Method decorators are a type of class decorator that are used to modify the behaviour of a specific method in a class.

Here's an example of a method decorator:

def trace(func):
    def wrapper(*args, **kwargs):
        print(f'Tracing {func.__name__}')
        return func(*args, **kwargs)
    return wrapper

class MyClass:
    def my_method(self, greeting):

my_class = MyClass()
my_class.my_method('Hello, world!')

In this example, we've created a "trace" method decorator function that takes a method "func" as an argument, and then returns a new function "wrapper". The "wrapper" function does a little bit of extra work by printing out the name of the method being called, and then calling the original function "func".

The "@trace" annotation is used to apply the decorator to the "my_method" method of the "MyClass" class. So when you call "my_class.my_method('Hello, world!')", it is really calling the modified function, which prints out "Tracing my_method" before executing the original function.

The Benefits of Using Python Decorators

Python decorators offer a number of benefits, including:

  1. Making code more readable and easier to understand by separating concerns
  2. Reusing code across multiple functions or classes
  3. Implementing advanced features such as caching, timing, and logging without cluttering up the main codebase
  4. Streamlining code by enabling you to combine multiple small functions into a single larger one.


Python decorators are an incredibly powerful way to add functionality to your code in a clean and easy-to-use way. Understanding how to use decorators is essential for anyone looking to develop their Python programming skills, and can help you to create more efficient, maintainable, and readable code. We hope that this article has given you a solid foundation in Python decorators and how to use them, and that you will start incorporating them into your own coding projects.

Editor Recommended Sites

AI and Tech News
Best Online AI Courses
Classic Writing Analysis
Tears of the Kingdom Roleplay
Learn Go: Learn programming in Go programming language by Google. A complete course. Tutorials on packages
Crypto Advisor - Crypto stats and data & Best crypto meme coins: Find the safest coins to invest in for this next alt season, AI curated
LLM Book: Large language model book. GPT-4, gpt-4, chatGPT, bard / palm best practice
Typescript Book: The best book on learning typescript programming language and react
Learn Python: Learn the python programming language, course by an Ex-Google engineer