@is_paid_user
def get_infomation() :
...
데코레이터는 장식/장식하는 사람을 말한다. 함수가 정의될때 @함수명
(위 예제코드참고)과 같은 구문을 보았다면 그것이 바로 데코레이터다!
언제 데코레이터를 사용하게 될까? 데코레이터의 기능 먼저 알아야 겠다. 위 예제코드를 보며 이해해 보자! 데코레이터로 선언된 함수는 is_paid_user
이고, 데코레이터를 사용할 함수는 아래 정의된 get_infomation
함수다.
is_paid_user
get_infomation
앞으로 get_infomation
함수를 호출 할 때마다 데코레이터로 선언된 is_paid_user
가 먼저 실행 될 것이다.
get_infomation
함수는 유료회원에게만 정보를 알려주는 함수이다. 이 함수는 유료회원에게만이라는 조건이 붙었다. 그래서 항상 실행전 is_paid_user
함수를 먼저 실행해 해당 유저의 정보를 파악한다.
아 ! 이 회원은 돈을 냈군 ! 정보를 알려줘도 좋다!
하지만, 항상 두개의 함수를 동시에 쓴다는 것을 잊을 수 있으니! 본드로 붙여놓든 @decorator
해주는 것이다.
@데코레이터기능함수명
def 함수명 () :
...함수내용 정의하기
return 중첩함수
데코레이터의 기능을 다르게 설명하면 decorator = chain of functions
마지막 함수를 제외한 함수들은 다음함수를 리턴해 주어야, 다음 함수가 실행 될 수 있다.
아! 다음 함수를 리턴해야 하는 구나!
라고 생각을 해도 어떻게 연결해야 한다는 건지 이해가 가지 않는다. 예제코드를 보자. 예제코드를 봐도 잘 이해가지 않는다..? 아래 코드를 보자
# 데코레이터로 사용할 함수 선언
def is_paid_user(func) :
user_paid = true # 예제코드니까..
def wrapper() :
if user_paid :
func() # 함수 인자 실행
else :
return # ??
return wrapper
# 데코레이터를 갖는 함수 선언
@is_paid_user
def get_infomation() :
return '정보'
# 데코레이터를 갖는 함수 호출
get_infomation()
# 함수를 호출하게 되면 파이싼이 아래와 같은 코드로 변환하여 호출한다.
decorated_function = is_paid_user(get_infomation)
decorated_function()
예제코드에서 최종적으로 실행될 때의 모습은 is_paid_user(get_infomation)
와 같다. 데코레이터를 실행할때 인자로 해당 함수를 전달하게 된다.