Decorator
라는 단어를 보면 무언가 꾸며주는 역할을 할 것 같지 않습니까? Decorator
는 함수를 입력받아 그 함수에 기능을 추가한 뒤 다시 함수 형태로 반환하는 함수입니다. 쉽게 말해 함수를 꾸며주는 함수
라고 생각하시면 됩니다.
Decorator
를 사용하게 되면 기존의 함수를 수정하지 않고 기능을 추가할 수 있습니다. 예를 들면 지금까지 만든 모든 함수에 시작과 끝을 알리는 기능을 넣고 싶다고 합시다.
def function_a():
# print("function start!")
print("function a")
# print("function end!")
def function_b():
# print("function start!")
print("function b")
# print("function end!")
def function_c():
# print("function start!")
print("function c")
# print("function end!")
위와 같이 모든 함수를 수정할 순 있겠지만 3개가 아니라 100개가 넘는 함수가 있다면 비효율적일 것입니다.
이런 경우에 더 Pythonic
한 개발을 하기 위해서는 Decorator
를 사용하면 됩니다.
def start_end_decorator(func):
def wrapper(*args, **kwargs):
# print("function start!")
func() # 여기서 입력되는 함수 실행
# print("function end!")
return func(*args, **kwargs)
return wrapper
위의 코드는 기본적인 구조의 Decorator
입니다. 이제 위의 Decorator
를 기존의 함수들에 적용하는 방법을 알아보겠습니다.
Decorator
를 적용하는 방법은 2가지가 있습니다.
function_a = start_end_decorator(function_a)
function_a()
위와 같이 데코레이터에 원하는 함수를 넘기는 방식이 있습니다. 하지만 이것보다 더 쉽고 코드가 보기 좋은 방법이 있습니다.
@start_end_decorator
def function_a():
print("function a")
위의 코드처럼 함수를 선언할때 위에 @
를 붙여 데코레이터를 호출할 수 있습니다.