Decorator는 기존에 있는 함수나 클래스를 변형시켜, 새로운 input이나, 새로운 값을 return 하도록 하는 방식.
argument도 같이 전달 가능하다.
시간 측정, logging에 유용하게 사용 가능하다.
def my_simple_function():
print("I am a normal function!")
def my_decorator(my_fn):
def modified_function():
print("start of decorator function")
my_simple_function()
print("end of decorator function")
return modified_function()
my_new_function = my_decorator(my_simple_function)
my_new_function()
# "start of decorator function"
# "I am a normal function!"
# "end of decorator function"
@my_decorator
def my_other_simple_function():
print("I do nothing")
my_other_simple_function()
# "start of decorator function"
# "I do nothing"
# "end of decorator function"
# Decorator definition
def my_better_decorator(my_fn):
def modified_function(*args, **kwargs):
print("start of decorator function")
my_simple_function(*args, **kwargs)
print("end of decorator function")
return modified_function
@my_better_decorator
def my_addr(x, y):
print(f"add {x} + {y} --> {x+y}")
my_addr(2, 3)
# "add 2 + 3 --> 5"
함수 별 시간 측정을 할때 유용하게 사용 가능.
import time
def time_decorator(my_func):
def modified_func(*args, **kwargs):
start = time.time()
my_func(*args, **kargs)
end = time.time()
print(f"Time taken is {end - start} seconds")
return modified_func
@time_decorator
def create_big_list(size):
new_list = []
for x in range(0, size):
new_list.append(x)
create_big_list(100000000)
# Time taken is 7.15