Python/파이썬 심화

데코레이터

monstro 2025. 9. 2. 20:17
728x90
반응형

- 개요

데코레이터는 클로저와 동일하게 함수를 파라미터로 받아서 함수를 반환하는 함수를 의미한다

하지만 데코레이터는 위의 목적말고도 함수와 메서드의 기능을 쉽게 수정하기 위한 수단으로써 사용할 수 있다

 

데코레이터를 사용하면서 얻을 수 있는 이점은 다음과 같다

  • 1) 코드의 가독성명확성 향상
  • 2) 높은 재사용성모듈화 -> 공통의 기능을 수행하는 경우 특히 유리함
  • 3) 유지보수 용이성 증대
  • 4) 기존의 코드를 안전하게 수정

 

반대로 데코레이터의 단점은 다음과 같다

  • 1) 코드의 복잡성 증가
  • 2) 특정 기능의 함수의 경우 단일 함수가 더 유리함
  • 3) 디버깅이 불편함

 

- 데코레이터의 선언

import time
def action_timer(func):
    def set_timer(*args):
        # 함수를 호출한 시간 / 함수 수행 결과 / 함수를 실행한 시간
        start_time = time.perf_counter()
        result = func(*args)
        finish_time = time.perf_counter()
        
        # 순수하게 함수를 수행한 시간 / 함수의 이름 / 함수의 인자
        execute_time = finish_time - start_time
        name = func.__name__
        arg_str = ', '.join(repr(arg) for arg in args)
        
        # 출력문
        print(f"함수 : {name}에 인자를 {arg_str}으로 하여 최종 {result}가 반환 /  {execute_time:.5f}초 만큼 실행")
        return result
    return set_timer

 

위와 같이 action_timer 함수를 outer로, set_timer 함수를 inner로 하여 데코레이터를 선언하였다

함수를 인자로 사용하여 데코레이터를 호출하고 해당 함수를 수행하는데 걸린 시간을 측정한다

 

- 데코레이터의 사용

...

@action_timer
def sum_all(*args):
    time.sleep(10)
    return sum(args)

sum_all(50, 40, 30)

 

함수 데코레이터의 인자로 사용하기 위해서는 어노테이션을 수식해야 한다

"@+생성한 데코레이터 이름"의 어노테이션을 함수에 수식하여 해당 함수를 데코레이터의 인자로 사용한다

데코레이터의 인자로 사용되는 함수를 호출하면 데코레이터를 수행한다

 

- 최종 실행 결과

 

위와 같이 함수를 사용한 시간을 측정하는 것을 확인할 수 있다

728x90
반응형

'Python > 파이썬 심화' 카테고리의 다른 글

병행성 - 기본 (2)  (0) 2025.09.14
병행성 - 기본 (1)  (0) 2025.09.14
클로저 (2)  (0) 2025.08.21
클로저 (1)  (0) 2025.08.18
일급 함수의 특징 (2)  (0) 2025.08.15