What is a Decorator?
A decorator is a small function that takes another function as an argument and returns a new function that “wraps” the original function. The new function produced by the decorator is then called instead of the original function when it’s invoked.
Syntax:
@decorator_name def function_to_decorate(): pass
How Decorators Work
Here’s a step-by-step breakdown of how decorators work:
- Define a decorator function: You define a function that takes another function as an argument. This function is the decorator.
- Apply the decorator: You apply the decorator to a function or class using the
@
syntax. - Create a new function: The decorator function returns a new function that wraps the original function.
- Replace the original function: The new function returned by the decorator replaces the original function.
- Call the decorated function: When you call the decorated function, you call the new function returned by the decorator.
Example: A Simple Decorator.
def log_calls(func): def wrapper(*args, **kwargs): print(f"Calling {func.__name__} with arguments {args} and {kwargs}") result = func(*args, **kwargs) print(f"{func.__name__} returned {result}") return result return wrapper @log_calls def add(a, b): return a + b result = add(2, 3) print(result)
Output:
Calling add with arguments (2, 3) and {} 5 add returned 5 5