본문 바로가기

카테고리 없음

Python : 데코레이터 정의, 장단점 및 예제

1. Python 데코레이터란 무엇인가?

Python 데코레이터는 함수나 메서드를 감싸서 동작을 수정하거나 확장할 수 있는 강력한 도구입니다. 데코레이터는 또 다른 함수를 반환하는 함수로, 주로 @ 표기법을 사용해 함수나 클래스에 적용됩니다.

 

주요 개념:

  • 동작 확장: 기존 코드를 수정하지 않고 새로운 기능을 추가합니다.
  • 재사용성: 중복된 로직을 데코레이터로 분리하여 여러 곳에서 재사용 가능합니다.
  • 클린 코드: 로직을 분리하여 코드 가독성을 높입니다.

예제

def my_decorator(func): # 대상함수를 입력값으로 받음
    def wrapper(*args): # 대상함수의 입력파라미터를 내부함수를 통해 받음
        print("함수 호출 전 작업")
        func(*args) # 대상함수 호출
        print("함수 호출 후 작업")
    return wrapper # 내부함수를 반환

@my_decorator # 데코레이터 적용
def say_hello(): # 대상함수
    print("안녕하세요!")

say_hello()

#출력
#함수 호출 전 작업
#안녕하세요!
#함수 호출 후 작업

 

2. Python 데코레이터의 장점

  • 코드 재사용성: 공통 로직을 별도 함수로 분리하여 중복 제거.
  • 모듈화: 핵심 로직과 부가적인 로직을 분리.
  • 가독성: 코드가 더 간결해지고 명확해짐.
  • 유연성: 함수, 클래스, 메서드 등에 자유롭게 적용 가능.

 

3. Python 데코레이터의 단점

  • 가독성 저하 가능성: 데코레이터의 동작을 이해하지 못하면, 코드 흐름 파악이 어려울 수 있음.
  • 디버깅 어려움: 데코레이터 내부에서 발생한 오류는 원래 함수의 오류처럼 보이기 어려움.
  • 추적성: 데코레이터가 여러 개 중첩될 경우 함수의 최종 동작을 추적하기 어려움.

 

4. 성능 측정을 위한 데코레이터 예제

아래는 함수의 실행 시간을 측정하는 데코레이터입니다.

import time

def timing_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.perf_counter()  # 시작 시간 기록
        result = func(*args, **kwargs)
        end_time = time.perf_counter()  # 종료 시간 기록
        print(f"{func.__name__} 실행 시간: {end_time - start_time:.4f}초")
        return result
    return wrapper

@timing_decorator
def example_function(n):
    total = 0
    for i in range(n):
        total += i
    return total

# 테스트
result = example_function(1_000_000)
print(f"결과: {result}")

#출력
#example_function 실행 시간: 0.0453초
#결과: 499999500000

 

  • time.perf_counter: 초 단위의 정밀한 시간 측정을 위해 사용.
  • 데코레이터: 실행 전후 시간을 측정하여 함수의 성능을 평가.

요약

Python 데코레이터는 코드를 수정하지 않고도 함수와 메서드의 동작을 확장하거나 수정할 수 있는 강력한 도구입니다. 장점과 단점이 명확하며, 성능 측정, 로깅, 인증 등 다양한 용도로 사용됩니다.

 

이 블로그에서 설명한 데코레이터로 성능을 측정해 보며, Python의 유연성을 체험해 보세요!