데코레이터는 사전적 의미로 "장식가"라는 의미를 가지고 있습니다. 파이썬의 Object를 꾸며주는 역할을 하고 있습니다. 정확히는 함수를 인수로 받는 객체입니다. 클래스 챕터에서 @staticmethod로 소개가 되었어요.

입력

def decorator(printname_func): #3
def wrapper(w_name): #5
print("이렇게 Object 앞에도 실행할 수 있습니다.")
printname_func(w_name) #6
print("이렇게 Object 뒤에도 실행할 수 있습니다.")
return wrapper #4

@decorator #2
def printname(name): #7
print(name)

printname('leehojun') #1

출력

이렇게 Object 앞에도 실행할 수 있습니다.
leehojun
이렇게 Object 뒤에도 실핼할 수 있습니다.

위의 코드에서 함수의 호출이 #1에서 일어납니다. 그러면 함수를 호출해야 하는데 앞에 데코레이터가 있으므로 #2를 실행하게 됩니다. #3에서 파라미터로 받고 있는 것은 함수입니다. #4에서 return 값으로 wrapper를 호출하고 있으므로 #5로 가게 됩니다. 여기서 파라키터로 받고 있는 것은 #1의 아규먼트입니다. #6 앞 뒤로 print 함수를 넣어 원래의 다양한 함수를 덧붙일 수 있다는 것을 보여드리고 있습니다. #6에서 #7함수가 호출되고 실행이 됩니다.

print(printname)
<funtion decorator.<locals>.wrapper at 0x0338B8E8>

위 코드에서 알 수 있듯이 데코레이터가 장식하고 있는 함수는 데코레이터의 wrapper를 가리키고 있습니다.

데코레이터는 함수를 좀 더 직관적으로 변화시킬 수 있습니다. 예를 들어 Django 같은 Python WEB framewor에서 로그임한 사용자에게만 함수의 권한을 허락할 때 @auth같이 사용 할 수 있을 것입니다.

<aside> 💡 파이썬 함수의 특징

</aside>

파이썬 함수는 일급 객체(First class object)입니다. 파이썬은 일반적으로 다른 객체들에 사용되었던 연산들을 대부분 지원하죠. 아래와 같이 대입 연산을 예로 들어보겠습니다.

a = 10