어떤 함수가 있다.
def plus(a, b): return a + b if __name__ == '__main__': plus(1, 2)
그 함수가 일어날 때 마다 어떤 동작 (소요시간 체크, 결과값 확인)이 일어나게 하고 싶다.
def plus(a, b): return a + b import time def tictoc(func, a, b): start_t = time.time() ret = func(a, b) end_t = time.time() print(end_t - start_t) # 소요시간 print(ret) # 결과값 return ret if __name__ == '__main__': # plus(1, 2) tictoc(plus, 1, 2)
tictoc함수에 함수 plus를 인자로 넣어줌으로써 해결하였지만, 문제점이 있다.
함수의 인자가 늘어나면 또 새로운 tictoc함수를 만들어줘야 한다.
decorator를 사용하면 더 간단하게 해결가능하다.
import time def tictoc_decorator(func): def wrapper(*args, **kwargs): start_t = time.time() ret = func(*args, **kwargs) end_t = time.time() print(end_t - start_t) print(ret) return ret return wrapper
@tictoc_decorator def plus(a, b): return a + b if __name__ == '__main__': plus(1, 2) help(plus)
그런데 이런 함수형 decorator는 지저분하기에 class형 decorator를 쓰는 것이 더 깔끔하다
class tictoc():
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
start_t = time.time()
ret = self.func(*args, **kwargs)
end_t = time.time()
print(end_t - start_t)
print(ret)
return ret