Decorator란? 사전적 의미로 장식또는 장식하는 사람이라는 뜻을 가지고 있다.
그럼 Python에서 무엇을 장식하기 위해서 Decorator를 사용할까?
그건 바로 Function 즉 함수를 사용할때 쓰인다.
어떻게 사용되는지 확인해보자.
예를들어 로또 번호를 찍어주는 업체가 있다고 가정하자.
이 로또업체는 무료회원과 유료회원이 나뉘어져 있으며 보내는 번호가 다르다.
이럴땐 문자를 유료회원가 무료회원을 나눠서 보내줘야한다.
def jackpot_lotto_information():
return "계시가 내려졌습니다. 1 5 12 15 28 35번을 찍으세요!"
위 문자는 유료회원만 받을수 있다고 가정해보자.
그러면 유료회원가 무료회원을 확인해주는 함수가 필요하다.
if is_paid_user():
jackpot_lotto_information()
그러면 이제 jackpot_lotto_information() 함수가 실행되기 전에 is_paid_user() 함수가 먼저 실행되야 할것이다.
if is_paid_user():
jackpot_lotte_information()
여기까지만 보면 별다른 문제는 없어보인다.
하지만 jackpot_lotto_information() 함수가 여러곳에 쓰인다면?
jackpot_lotto_information()함수가 쓰여야 할때는 무조건 is_paid_user() 함수가 먼저 호출되어야 한다.
코드를 작성할때 한군대라도 is_paid_user()를 빼먹는다면?
사람은 누구나 실수를 한다. 그렇기 때문에 빼먹을수도 있다.
이것을 방지하기 위해 있는것이 Decorator다.
사용법은 간단하다.
@is_paid_user
def jackpot_lotto_information():
return "계시가 내려졌습니다. 1 5 12 15 28 35번을 찍으세요!"
@를 붙이고 함수 이름만 적어주면 된다.
그냥 위에 붙어있는게 꼭 장식 같아서 Decorator라고 불리는것 같다.
위와 같이 Decorator로 달아놓으면 해당 함수가 호출되면 장식으로 달린 함수가 먼저 호출되고 난후 본 함수가 호출이 된다.
근데 아무 함수나 Decorator로 장식할수 있는것이 아니다.
Decorator로 장식할 수 있는 함수는 중첩 함수(nested function)을 리턴하는 함수만 decorator 함수로 사용될 수 있다.
그 이유는 decorator의 기능을 다르게 설명 하면 chain of functions, 즉 여러개의 함수가 연속적으로 호출이 자동으로 되게 해준다.
그러려면 마지막 함수를 제외한 함수들은 그 다음 함수를 리턴해주어야 파이썬이 함수들을 차례대로 호출 해줄 수 있다.(만일 다음 함수를 리턴하지 않고 다른 값을 리턴해버리면 그 다음 함수로 넘어가지 못하고 그냥 함수 실행이 종료되기 때문이다)
그렇기 때문에 decorator 함수는 그 다음 함수를 리턴해주어야 한다.
def is_paid_user(func):
user_paid = True # 간단화 하기 위해 무조건 True
def wrapper(*args, **kwargs):
if user_paid:
func()
else:
return
return wrapper
위에 is_paid_user() 함수를 만들었다.
위 함수를 Decorator만 하면!
@is_paid_user
def jackpot_lotto_information():
return "계시가 내려졌습니다. 1 5 12 15 28 35번을 찍으세요!"
jackpot_lotto_information() 함수가 호출되면 파이썬이 아래와 같이 변환해서 호출해준다.
drcorated_function = is_paid_user(jackpot_lotto_information)
decorated_fuction()