Python decorators are a powerful feature that allows you to modify the behavior of functions or classes. They provide a way to simplify your code, add functionality, and enable code reuse. Let’s explore decorators in Python:
- Function Decorators:
Function decorators are the most common type of decorators in Python. They wrap a function with another function, allowing you to modify the input, output, or behavior of the original function. Here’s an example of a simple function decorator:
def decorator(func):
def wrapper(*args, **kwargs):
# Code to run before calling the decorated function
result = func(*args, **kwargs) # Call the decorated function
# Code to run after calling the decorated function
return result
return wrapper
@decorator
def my_function():
# Function implementation
pass
In the above example, the decorator
function is used as a decorator for the my_function
. It wraps my_function
with the wrapper
function, allowing you to execute additional code before and after calling my_function
.
- Class Decorators:
Similar to function decorators, you can also create decorators for classes. Class decorators wrap a class with another class, enabling you to modify the behavior or add functionality to the original class. Here’s an example of a class decorator:
def decorator(cls):
class Wrapper:
def __init__(self, *args, **kwargs):
self.wrapped = cls(*args, **kwargs)
def some_method(self):
# Additional code to execute
self.wrapped.some_method()
# Additional code to execute
return Wrapper
@decorator
class MyClass:
def some_method(self):
# Method implementation
pass
In this example, the decorator
function acts as a class decorator for the MyClass
. It wraps MyClass
with the Wrapper
class, which provides additional functionality around the original class.
- Decorating with Arguments:
Decorators can also accept arguments to customize their behavior. To achieve this, you need to define an outer function that takes arguments and returns the actual decorator. Here’s an example:
def decorator_with_args(arg1, arg2):
def decorator(func):
def wrapper(*args, **kwargs):
# Code using arg1 and arg2
result = func(*args, **kwargs)
# Code using arg1 and arg2
return result
return wrapper
return decorator
@decorator_with_args('arg1_value', 'arg2_value')
def my_function():
# Function implementation
pass
In this example, decorator_with_args
returns the actual decorator based on the provided arguments. The returned decorator then wraps the my_function
.
Decorators are powerful tools for simplifying code and adding functionality without modifying the original functions or classes. They can be used for tasks like logging, timing, authentication, caching, and more. Python’s decorator syntax and flexibility allow you to create reusable code patterns and enhance the functionality of your applications.