Decorators in Python are a very powerful and useful tool that allows programmers to modify the behavior of a function or class. Decorators allow you to wrap another function in order to extend the behavior of the wrapped function, without permanently modifying it.
In Python, functions are first-class objects, meaning they can be passed around and used as arguments. A decorator is a function that takes another function and extends its behavior without explicitly modifying it.
A decorator is defined as a function that takes another function as an argument and returns yet another function.
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
def say_hello():
print("Hello!")
# Applying the decorator
say_hello = my_decorator(say_hello)When you call say_hello(), the wrapper function is called, which adds behavior before and after the say_hello function runs.
Python allows a simpler syntax for applying decorators using the @ symbol.
@my_decorator
def say_hello():
print("Hello!")
say_hello()Sometimes, you might need a decorator that accepts arguments. You can achieve this by adding another level of function nesting.
def decorator_with_args(arg):
def my_decorator(func):
def wrapper():
print(f"Decorator argument: {arg}")
func()
return wrapper
return my_decorator
@decorator_with_args("Custom argument")
def say_hello():
print("Hello!")
say_hello()Python provides a couple of built-in decorators: @staticmethod and @classmethod.
@staticmethod: Defines a method as a static method that doesn’t access instance or class data.@classmethod: Defines a method as a class method that receives the class as the first argument.
Decorators are a very powerful and expressive feature of Python. They allow for the extension or alteration of a function's behavior in a clean, concise, and readable manner. This capability is extremely useful for aspects like logging, access control, measuring execution times, and more, without having to change the function's code.