데코레이터는 한글 이름은 장식자 정도로 번역되는데
이 역시 design pattern에서 나온 이름이고요,
근데 이게 장식자라고 하면 일단 뭔가 감도 잘 안오고 하는데
이 데코레이터의 개념은 일종의 함수 wrapping입니다.
함수를 바깥에서 한번 싸는거죠.
@deco_method
def func1(x):
return x+1
이런식의 함수가
func1 = deco_method(func1)
이런식으로 한번 래핑(wrapping)을 해주는 것입니다.
import time
def elapsed_time(functor):
def decorated(*args, **kwargs):
start = time.time()
functor(args, kwargs)
end = time.time()
print "Elapsed time: %f" % (end-start)
return decorated
@elapsed_time
def hello():
print 'hello'
보통 이런식으로 많이들 사용합니다.
위의 예제는 하나의 함수가 시간이 얼마나 걸리는지를 재는데 사용하는 예제이고요,functor가 래핑할 함수이고요,
start, end부분은 전후로 들어갈 부분입니다.
그래서 사용예제들을 보면 디버깅하는데 사용하거나,
-> arg, kwargs를 조사해서, 값을 찍어주는 용도로 쓰기도 하고요
자주사용하는 진입루틴, 출구루틴에 사용을 합니다.
ex ) @login
login이 되어있으면 함수를 실행 아니면, 패스하는 식의 조건을 걸고,
함수를 실행시키는 다던지 하는 용도로 많이 사용을 합니다.
또 데코레이터는 argument를 받을 수도 있습니다.
@deco_method(argument)
이런형태로 쓰여져서 실제로 함수를 wrapping하는 중간에
다른동작도 가능하게 설계가 되어있습니다.
찾아보면 활용법이 많은 방법입니다.
전통적인 언어와는 좀 다르기때문에 헷갈릴수도 있는데 쓰면 쓸수록 장점이 많은 방법입니다.
또 위에서는 함수 데코레이터에 대해서만 얘기를 했는데,
클래스 데코레이터라는게 있습니다.
요것에 대해서는 조만간 또 작성을 해보겠습니다.
댓글 없음:
댓글 쓰기