Python Decorator

빈코더·2021년 1월 23일
0

파이썬

목록 보기
1/7
post-thumbnail

Python Decorator

Python Decorator에 대해서 알아보자.

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()
profile
미래의 리눅스 토발즈

0개의 댓글