[파이썬] 데코레이터와 코드 재사용

데코레이터(decorators)는 파이썬에서 코드를 재사용하고 모듈화하는 강력한 도구입니다. 데코레이터는 기존의 함수나 클래스를 수정하지 않으면서 새로운 기능을 추가하거나 기능을 변경할 수 있습니다.

데코레이터는 @ 기호를 사용하여 함수나 클래스 위에 적용됩니다. 데코레이터는 함수로 작성되며, 데코레이터에 적용된 함수나 클래스를 래핑하여 원래의 동작을 변경하거나 기능을 추가합니다.

데코레이터의 사용 예시

다음은 기존 함수에 데코레이터를 적용하여 호출 전후에 로그를 남기는 예시입니다.

def logger(func):
    def wrapper(*args, **kwargs):
        print("함수 호출 전")
        result = func(*args, **kwargs)
        print("함수 호출 후")
        return result
    return wrapper

@logger
def add_numbers(a, b):
    return a + b

result = add_numbers(10, 5)
print(result)

위의 코드에서 logger 데코레이터는 add_numbers 함수를 래핑하여 함수 호출 전후에 로그를 출력합니다. 이를 사용하여 실제 함수 호출 시 로깅 작업을 반복하는 번거로움을 줄일 수 있습니다.

데코레이터의 이점

데코레이터를 사용하는 가장 큰 장점은 코드 재사용과 모듈화를 쉽게 할 수 있다는 것입니다. 데코레이터는 기존의 코드를 변경하지 않고도 새로운 기능을 추가하거나 변경할 수 있으므로, 코드의 유지보수를 용이하게 합니다.

다음은 데코레이터를 사용하여 캐시 기능을 추가한 예시입니다.

import time

def cache(func):
    caches = {}
    def wrapper(*args, **kwargs):
        if args in caches:
            print("캐시된 결과를 반환합니다.")
            return caches[args]
        else:
            result = func(*args, **kwargs)
            caches[args] = result
            return result
    return wrapper

@cache
def calculate_factorial(num):
    time.sleep(1)  # 시간이 오래 걸리는 작업
    if num == 0:
        return 1
    else:
        return num * calculate_factorial(num - 1)

result = calculate_factorial(5)
print(result)

위의 코드에서 cache 데코레이터는 calculate_factorial 함수의 결과를 캐시하여 동일한 인자로 함수가 호출될 때마다 계산을 반복하지 않습니다. 이를 통해 함수의 성능을 향상시킬 수 있습니다.

데코레이터를 사용하여 코드를 모듈화하고 재사용하여 개발자는 더 직관적이고 간결한 코드를 작성할 수 있습니다. 데코레이터는 파이썬에서 함수형 프로그래밍과 같은 많은 패러다임을 지원하기도 합니다.