[Python] 데코레이터 구현, 사용, 작동과정

azzurri21·2022년 1월 22일
0

구현

  • 내부함수를 반환하는 클로저 형태.

  • 외부함수의 매개변수는 함수객체 하나만.

  • 내부함수의 매개변수는 꾸며진 함수와 같은 구성이거나 가변매개변수로 설정.

  • 내부함수에서 프리변수인 꾸며진 함수를 호출.

사용

trace는 데코레이터 함수, foo는 꾸며지는 함수라 하자.

함수 trace(foo())를 호출하거나, @trace를 foo의 선언 위에 작성하고 foo()처럼 호출.

원리

<예시 코드>

def uppercase(obj):
    def wrapper():
        modi_result = obj().upper()

        return modi_result
    
    return wrapper

@uppercase
def hi():
    return f'Long time no see'


if __name__ == '__main__':
    print(hi())

print(hi())의 실행과정:

  1. hi 함수가 @uppercase로 꾸며진 함수이므로 hi는 uppercase(hi)로 치환됨.
  2. uppercase 함수는 wrapper 함수(객체)를 반환함.
  3. 반환된 wrapper 함수가 실행됨.
  4. wrapper 함수는 클로저이므로 프리변수인 obj를 호출하면 이전에 저장되었던 hi가 호출됨.
  5. wrapper 함수의 반환값인 modi_result가 최종으로 반환되고, print 함수에 전달되어 출력됨.

[참고]
hi 함수를 @uppercase로 꾸미는 것은
hi 함수 호출문 위에 hi = uppercase(hi)를 삽입하여
hi라는 이름에 할당된 함수객체를 변경하는 것과 같다.

profile
파이썬 백엔드 개발자

0개의 댓글