It turns out that you can also write decorators using classes! 💡
Check out the basic comparison below:
• Function-based: keeps it simple. 🛠️ • Class-based: scalable for more complex needs (e.g. state management, flexibility, reusability and additional functionality). 📈
import time
# function-based
def timeit(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(
f"Function {func.__name__} took {end_time - start_time:.4f} seconds to execute"
)
return result
return wrapper
@timeit
def test_function(x):
return sum([i * x for i in range(10000)])
test_function(2)
# class-based
class TimeItClass:
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
start_time = time.time()
result = self.func(*args, **kwargs)
end_time = time.time()
print(
f"Function {self.func.__name__} took {end_time - start_time:.4f} seconds to execute"
)
return result
@TimeItClass
def test_function2(x):
return sum([i * x for i in range(10000)])
test_function2(2)
#decorators