데코레이터

테코레이터는 함수의 앞뒤로 부가적인 기능을 넣어주고 싶을 때 사용한다. 대표적으로 로깅이나 권한(로그인체크) 확인에 사용된다.

  • 클로저를 이용해서 생성
  • 적용하고 싶은 함수앞에 @데코레이터

데코레이터 생성하기

예를 들어 함수가 시작되었는지 함수가 종료되었는지 로그를 남기고 싶다고 하자. 아래와 같이 함수를 작성하면 새로운 함수를 작성할 때마다 print()문을 사용해야 한다.

def print_hello():
    print('함수 시작')
    print('Hello')
    print('함수 종료')

def print_bye():
    print('함수 시작')
    print('Bye')
    print('함수 종료')
>>> print_hello()
함수 시작
Hello
함수 종료
>>> print_bye()
함수 시작
Bye
함수 종료

함수 안에서의 중복을 제거하는 역할을 데코레이터가 할 수 있다. 이제 함수의 시작과 끝을 넣어주는 데코레이터를 만들어본다.

# 데코레이터 생성하기
def logger(func):
    def wrapper(arg):
        print("함수 시작")
        func(arg) # 함수 실행
        print("함수 끝")
    return wrapper
    
@logger
def print_hello(name):
    print("hello", name)

@logger
def print_bye(name):
    print("bye", name)

이렇게 하면 @logger는 데코레이터를 먼저 찾고 print_hello()를 func으로 넘겨준다.

>>> print_hello('SYJ')
함수 시작
hello SYJ
함수 끝
>>> print_bye('SYJ')
함수 시작
bye SYJ
함수 끝