데이터과학 삼학년

Decorator (데커레이터) 본문

Python

Decorator (데커레이터)

Dan-k 2020. 1. 26. 19:26
반응형

파이썬 데커레이터는 말 그대로 꾸며주는 함수라고 생각하면 된다.

 

클로저와 데커레이터의 가장 큰 차이는 데커레이터는 함수를 argument로 받는다는 점이다.

 

실행 시간을 나타내는 clock이라는 데커레이터를 보자

 

import time

def clock(func):
  def clocked(*args):
    t0 = time.perf_counter()
    result = func(*args)
    elapesd = time.perf_counter() - t0
    name = func.__name__
    arg_str = ', '.join(repr(arg) for arg in args)
    print('[%0.8fs] %s(%s) -> %r' %(elapesd, name, arg_str, result))
    return result
  return clocked

이렇게 clock이라는 데커레이터를 만들고

적용방법은 @<데커레이터함수명> 으로 함수위에 호출해주면 된다

 

@clock
def sum(n):
  c = 0
  for i in range(n+1):
    c += i
  return c

위처럼 데커레이터를 적용해주면

 

이러한 결과를 얻을 수 있다.

 

데커레이터 관련해서는 cache를 사용하는 방법도 있는데..그것은 다음에 소개하도록 하겠다.

 

암튼 데커레이터는 내가 사용하고자 하는 function을 꾸며주는(기능을 추가해주는) 역할로 보면되고,

 

파이썬에서 데커레이터로 총 @property, @classmethod, @staticmethod 3개의 내장함수를 제공해준다!

 

실제로 데커레이터로 많이 쓰이는 것은 functools.lru_cache 인데.. 이것은 memoization을 구현하여, 이전에 실행했던 인수(args)에 대해 다시 계산할 필요가 없게 해주며, 무한정으로 cache를 늘리지 않기 위해 오랫동안 사용하지 않은 항목은 버리는 것을 의미한다.(lru : least recently used) 

728x90
반응형
LIST

'Python' 카테고리의 다른 글

모듈, 패키지 개념 정리 (if __name__=='__main__': 쓰는 이유)  (4) 2020.03.23
OS 모듈 정리  (0) 2020.03.02
Closer (클로저)  (0) 2020.01.12
Abstract method (추상 메서드)  (0) 2020.01.10
파이썬 Multiprocessing  (4) 2020.01.09
Comments