Decorator는 기존에 있는 함수나 클래스를 변형시켜, 새로운 input이나, 새로운 값을 return 하도록 하는 방식.

argument도 같이 전달 가능하다.

시간 측정, logging에 유용하게 사용 가능하다.

Creating Decorators

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"

Using @ notation

@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"

Using arguments inside decorators


# 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"

Using decorator for Time Analysis

함수 별 시간 측정을 할때 유용하게 사용 가능.

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