쓰는 이유는 간단하다.
특정 함수를 호출할 때 사전에 작동시키고 싶은 작업이 있는 경우이다.
끝. 뭔말인지 좀 그러니까 간단하게 코드로 구현해보자.
# 데코레이터 정의 및 작성
def my_decorator(my_function):
def my_wrapper(name, *args, **kwargs):
print(f'"{name}"님 안녕하세요!!! => decorator')
return my_function(name, *args, **kwargs)
return my_wrapper
# 데코레이터 사용
@my_decorator
def name_age(name, age):
print(f'"{name}"님은 "{age}"살 입니다!')
# 호출
name_age('yerang', 33)
# 결과
'''
"yerang"님 안녕하세요!!! => decorator
"yerang"님은 "33"살 입니다
'''
원하는 이름으로 정의한다. (my_decorator)
이 때 뒤에 호출시킬 함수를 인자값으로 받는다. (my_function)
데코레이터 안에 작동시킬 작업을 함수로 정의한다. (my_wrapper)
이 때 뒤에 호출시킬 함수의 인자값을 그대로 인자값으로 받는다. (name, *args, **kwargs)
my_wrapper 작성 =>
my_wrapper를 호출하는 코드를 작성한다. => return my_wrapper
@my_decorator
def name_age(name, age):
print(f'"{name}"님은 "{age}"살 입니다!')
name_age('yerang', 33)
끝. 처음엔 데코레이터의 작동 원리가 헷갈렸지만 직접 코드로 작성해보니 이해가 수월하다.
간단하게 말하자면,
반복될 작업을 데코레이터로 정의하고, 데코레이터 안에 원하는 작업을 함수로 작성하고,
사용한다! 호출할 함수 앞에 @my_decorator 형태로 붙여서. YES!
한번 데코레이터를 정의해 놓으면 코드 어디서나 간단하게 데코레이터를 붙여 쓸 수 있으므로 매우 편리하다. GOOD!