Python Decorators (With Types & Examples)

Python Decorators are a powerful feature that improves code reusability, readability, and maintainability. They are widely used in real-world applications from authentication mechanisms to performance monitoring. Let us get a detailed overview on Python Decorators through this article.
authorImageVarun Saharawat30 Oct, 2025
Python Decorators (With Types & Examples)

Python decorators are modules which can help create more code reusability and build efficiency of developers and designers. Python is a language known for its simplicity and elegance. Among its many powerful features, decorators stand out as a tool that enhances code modularity and reusability. If you have ever wanted to modify the behavior of a function without changing its core implementation, then decorators are the magic wand you need!

In this blog, we will go through thoroughly into Python decorators, understand their working, explore practical use cases, and learn how to create custom decorators. Additionally, we will examine real-world applications and the best practices for writing efficient decorators. 

What are Python Decorators?

A decorator in Python is a higher-order function that allows us to modify another function or method dynamically, without altering its actual code. In simple terms, a decorator takes a function as input, adds some functionality, and returns a new function.  Python decorators Decorators are widely used in Python frameworks, including Django and Flask, where they help in handling authentication, logging, and other pre/post-processing tasks. 

Higher-Order Functions

Before diving into decorators, it is important to understand higher-order functions. Higher-order functions are functions that either take another function as an argument or return a function as a result. This forms the founders of decorators. This ability to pass functions around is what makes decorators possible: 
Higher-Order Functions 
def shout(text):        return text.upper() def whisper(text):       return text.lower() def greet(func):       return func(“Hello, World!”) print(greet(shout)) print(greet(whisper))
Output:

HELLO, WORLD!

hello, world!

Understanding Python Decorators With a Simple Example

python decorators  

Okay, now that we know about higher-order functions, let us dive deep into decorators by starting from simple examples. Let us consider the following example: 
A Simple Example of Python Decorators
#defining a simple decorator  def my_decorator(func):        def wrapper():            print(“Something is happening before the function is called.”)            func()            print(“Something is happening after the function is called.”)        return wrapper #Using the decorator @my_decorator  def say_hello():       print(“Hello, World!”) say_hello()
Output: 

Something is happening before the function is called. 

Hello, World!

Something is happening after the function is called. 

(Here my_decorator is wrapping the say_hello function and modifying its behavior without altering its actual code.) 

Why Use Decorators?

UI elements Cards Decorators are something that makes code more reusable and readable. Some of the major reasons for using Python decorators include
  • Code Reusablility: Apply the same logic, like logging or authentication, to multiple functions without rewriting the code. 
  • Code Readability: Keep functions clean and separate concerns effectively
  • Pre/Post Processing: Execute additional logic before or after a function call Performance Monitoring: Measure execution time for optimization. 
  • Access Control and Security: Restrict access to specific functionalities. 

Types of Python Decorators 

Python provides built-in decorators as well as the ability to create custom ones. Major types of Python decorators are mentioned below: 

1. Function Decorators: The Swiss Army Knife of Python

Function decorators are the most commonly used decorators. They modify function behavior dynamically, making them perfect for logging, authentication, and performance tracking.  For instance:
Function Decorators
import time def timer_decorator(func):       def wrapper(*args, **kwargs):              start_time = time.time()              result = func(*args, **kwargs)              end_time = time.time()              print(f”Execution time: {end_time - start_time: .4f} seconds”)              return result       return wrapper @timer_decorator def compute():       time.sleep(2)       print(“Function execution complete!”) compute()
The above decorator measures and prints the execution time, making it a handy tool for performance optimization. 

2. Class Decorators: The Architect of Object Behavior

Class decorators modify or extend class functionality. Unlike function decorators, they operate on class instances, making them useful for modifying class behavior dynamically.  For instance: 
Class Decorators Example
class DecorateClass:          def __init__(self, func):                self.func = func           def __call__(self, *args, **kwargs):                 print(“Class decorator executed before the function call.”)                 return self.func(*args, **kwargs) @DecorateClass  def greet(name):       print(f”Hello, {name}!”) greet(“Alice”)
Here, the above DecorateClass acts as a decorator and modifies the behavior of the greet function before execution.

3. Built-In Decorators: Python’s Secret Superpowers

Python provides several built-in decorators for streamlining code development, some of them are mentioned below in brief: 
  • @staticmethod: defines a static method inside a class.
  • @classmethod: defines a class method.
  • @property: converts a method into a read-only property.
Built-In Decorators Example
class Person:          def __init__(self, name, age):                self.name = name                self.age = age                        @property           def info(self):                return f”Name: {self.name}, Age: {self.age}” p = Person(“John”, 30) print(p.info)  #accessing method as a property 

 4. Custom Decorators With Arguments: Power Meets Flexibility

Sometimes, decorators need additional parameters to fine-tune their functionality, then we use this decorator. For instance: 
Custom Decorators With Arguments Example
def repeat(n):       def decorator(func):              def wrapper(*args, **kwargs):                     for _ in range(n):                          func(*args, **kwargs)               return wrapper        return decorator @repeat(3)   def greet():       print(“Hello”) greet()
This decorator above repeats function execution n times, making it useful for retry mechanisms. 

5. Chaining Multiple Decorators: Stacking Functionality

Python allows chaining multiple decorators to enhance functionality. Let us see an example on how chaining constructor is implemented:
Chaining Multiple Decorators Example
def uppercase(func):     def wrapper():         return func().upper()     return wrapper def exclaim(func):     def wrapper():         return func() + "!!!"     return wrapper @uppercase @exclaim def speak():     return "hello" print(speak())  # Output: HELLO!!!
Output:  HELLO!!!

Best Practices for Using Python Decorators

frontend developers planning To make the most out of Python decorators, here are some best practices to follow, mentioned below: 

1. Use functools.wraps to Preserve Metadata

When wrapping a function with a decorator, the original function’s metadata, such as its name and docstring, can be lost. Using functools.wrap ensures that the wrapped function retains its original attributes. A simple example of this is mentioned below: 
Practice 1: Use of functools.wrap
import functools def my_decorator(func):     @functools.wraps(func)     def wrapper(*args, **kwargs):         print("Decorator logic here")         return func(*args, **kwargs)     return wrapper @my_decorator def example():     """This is an example function."""     print("Function executed.") print(example.__name__)  print(example.__doc__)   
Output:

example

This is an example function

2. Keep Decorators Lightweight 

Since decorators wrap around functions, they can introduce performance overhead. Ensure your decorator performs only necessary operations and avoids excessive computations. 

3. Pass Arguments Dynamically 

Decorators should be designed tp handle arbitrary arguments (*args and **kwargs) so they remain flexible and reusable 
Practice 3: Passing Arguments Dynamically 
def flexible_decorator(func):     def wrapper(*args, **kwargs):         print("Arguments received:", args, kwargs)         return func(*args, **kwargs)     return wrapper @flexible_decorator def greet(name, message):     print(f"{message}, {name}!") greet("Alice", message="Hello")

Chain Decorators Carefully 

When stacking multiple decorators on a function, be mindful of the execution order. The top-most decorator runs last. An example of it is mentioned below: 
Practice 4: Chaining Decorators carefully 
def uppercase(func):     def wrapper():         return func().upper()     return wrapper def exclaim(func):     def wrapper():         return func() + "!!!"     return wrapper @uppercase @exclaim def speak():     return "hello" print(speak()) 
Output:

HELLO!!!

Document Decorators for Maintainability

Always add clear doctrings to decorators so that other developers understand their purpose and usage. An example of it can be: 
Practice 5: Document Decorators 
def log_function_call(func):     """Logs when a function is called."""     def wrapper(*args, **kwargs):         print(f"Calling function {func.__name__}")         return func(*args, **kwargs)     return wrapper

Python Decorators FAQs

Q1. What are Python Decorators?

Ans. A decorator in Python is a higher-order function that allows us to modify another function or method dynamically without altering its actual code. In simple terms, a decorator takes a function as input, adds some functionality, and returns a new function.

Q2. Why do we use Python decorators?

Ans. Python Decorators are a powerful feature that improves code reusability, readability, and maintainability. They are widely used in real-world applications, from authentication mechanisms to performance monitoring.

Q3. What are the types of Python decorators?

Ans. There are majorly five types of Python decorators including built-in, class, function, custom, and chaining multiple decorators. A detailed overview on the types of the decorators are mentioned above in the article.

Q4. What is a Function Decorator?

Ans. Function decorators are the most commonly used decorators. They modify function behavior dynamically, making them perfect for logging, authentication, and performance tracking.