파이썬 closure함수와 데코레이터 코드는 아주 비슷하다. 다만 함수를 다른 함수의 인자로 전달한다는 점이 조금 틀리다.
# closure function
def def outer_function(msg):
def inner_function():
print(msg)
return inner_function
hi_func = outer_function('Hi')
bye_func = outer_function('Bye')
hi_func() # >>> hi
bye_func() # >>> bye
# decorator
def decorator_function(original_function): # 1
def wrapper_function(): # 5
return original_function() # 7
return wrapper_function # 6
def display(): # 2
print('display 함수가 실행 되었습니다.') # 8
decorated_display = decorator_function(display) # 3
decorated_display() # 4 # >>> display 함수가 실행 되었습니다.
위의 코드는 다음과 같은 내용이다.
데코레이터라는 것을 도데체 왜 쓰는걸까? 그 이유는 이미 만들어져 있는 기존의 코드를 수정하지 않고도, 래퍼(wrapper) 함수를 이용하여 여러가지 기능을 추가할 수가 있기 때문이다.
Reference