데코레이터는 사전적 의미로 "장식가"라는 의미를 가지고 있습니다. 파이썬의 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같이 사용 할 수 있을 것입니다.
파이썬 함수의 특징
파이썬 함수는 일급 객체(First class object)입니다. 파이썬은 일반적으로 다른 객체들에 사용되었던 연산들을 대부분 지원하죠. 아래와 같이 대입 연산을 예로 들어보겠습니다.
a = 10
앞서 a도 object이고 10도 object라는 것을 실습으로 알고 계실 것입니다. type이라는 연산자를 통해 알려드렸었죠.
def printhello(): #1 print("hello") hello=printhello #2
여기서 printhello 함수는 하나의 object가 됩니다. hello라는 변수도 object이죠. 그러니 함수를 대입하는 연산도 가능합니다.
>>>hello() hello
인자값도 동일하게 전달이 됩니다.