• 어떤 함수를 받아 명령을 추가한 뒤 이를 다시 함수의 형태로 반환하는 함수
• 어떤 함수의 내부를 수정하지 않고 기능에 변화를 주고 싶을 때 사용한다
• 말그대로 다른 함수를 꾸며주는 함수
def 데코레이터이름(func): # 기능을 추가할 함수를 인자로 받아온다.
def 내부함수이름(*args, **kwargs):
기존 함수에 추가할 명령
return func(*args, **kwargs)
return 내부함수이름
클로저와 매우 흡사하게 생겼다는 것을 알 수 있다. 차이점이라면 데코레이터는 다른 함수를 인자로 받는다는 점이다.
def decorator(func): # 1
def wrapper(*args, **kwargs): # 4
print('Hello') # 7
return func(*args, **kwargs) # 8
return wrapper # 5
def introduce(name): # 2
print(f'My name is {name}!') # 9
decorated_introduce = decorator(introduce) # 3
decorated_introduce('JunHa') # 6
• #1 : decorator 라는 함수가 정의되었다.
• #2 : introduce 라는 함수가 정의되었다.
• #3 : decorator 함수에 introduce 함수를 인자로 전달하여 호출하였다. 그 출력값을 decorated_introduce 라는 변수에 할당하기로 한다.
• #4 : decorator 함수가 호출되어 내부 명령이 실행된다. wrapper 라는 함수가 정의되었다.
• #5 : wrapper 함수가 호출되지 않은 함수 자체의 상태로 리턴되었다. 따라서 아직 wrapper 함수 내의 명령들은 실행되지 않는다.
• #6 : decorated_introduce 변수에는 decorator 함수의 리턴값 즉, 호출되지 않은 wrapper 함수가 할당된다.
따라서 decorated_introduce('JunHa') 는 wrapper('JunHa') 과 같아진다.
실제로 아래와 같이 확인해보면 decorated_introduce 함수에는 decorator 함수의 로컬 스콥에 있는 wrapper 함수가 할당되어 있는 것을 볼 수 있다.