Python의 Decorator 패턴: 고급 함수 활용법
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
Python은 그 유연성과 다양한 기능 덕분에 프로그래머들 사이에서 매우 인기 있는 언어입니다. 특히, 데코레이터(decorator)는 Python의 고급 기능 중 하나로, 함수나 메소드의 동작을 수정하거나 확장할 때 사용됩니다. 이 글에서는 Python에서 데코레이터 패턴의 개념을 설명하고, 실제 코드 예제를 통해 이를 어떻게 활용할 수 있는지 탐구하겠습니다.
데코레이터 패턴의 기본 개념
Python의 데코레이터는 함수를 다른 함수의 인자로 전달하고, 그 함수를 호출하기 전후에 추가적인 코드를 실행할 수 있도록 해주는 구조입니다. 이는 소프트웨어 설계 원칙 중 하나인 개방/폐쇄 원칙(Open/Closed Principle)을 따르는 좋은 예로, 기존 코드를 변경하지 않고도 객체의 기능을 확장할 수 있습니다.
데코레이터의 사용 방법
Python에서 데코레이터를 사용하는 방법은 간단합니다. 기본적으로 데코레이터는
@
심볼을 사용하여 함수 위에 배치됩니다.
간단한 데코레이터 예제:
def my_decorator(func):
def wrapper():
print("Something is happening before the function is called.")
func()
print("Something is happening after the function is called.")
return wrapper
@my_decorator
def say_hello():
print("Hello!")
say_hello()
위의 코드에서 my_decorator
는 say_hello
함수의 동작을
변경하는 데코레이터입니다. say_hello
함수를 호출하면, 실제로
wrapper
함수가 호출되며, 이 함수 내에서 say_hello
가
실행됩니다.
데코레이터의 실용적인 활용 예
- 로깅과 감사: 함수의 실행을 로깅하거나 실행 데이터를 감사(audit)하기 위해 사용할 수 있습니다.
- 성능 측정: 함수의 실행 시간을 측정하여 성능을 모니터링할 수 있습니다.
- 인증과 권한 부여: 특정 함수에 대한 접근을 제어하기 위해 인증 로직을 추가할 수 있습니다.
- 캐싱: 결과를 캐시하여 성능을 향상시킬 수 있습니다.
성능 측정 데코레이터 예제:
import time
def timing_decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"{func.__name__} took {end_time - start_time:.4f} seconds to complete.")
return result
return wrapper
@timing_decorator
def complex_calculation(number):
return sum([i * number for i in range(100000)])
complex_calculation(5)
데코레이터의 주의점
데코레이터를 사용할 때는 몇 가지 주의해야 할 점이 있습니다. 데코레이터는
함수의 원래 정보를 숨길 수 있으므로, functools.wraps
를 사용하여
원래 함수의 정보를 유지할 필요가 있습니다. 또한, 데코레이터가 추가된 함수의
성능에 영향을 줄 수 있으므로 사용 전에 성능을 테스트해야 합니다.
결론
Python의 데코레이터 패턴은 코드를 깔끔하게 유지하면서도 기능을 확장할 수 있는 매우 강력한 도구입니다. 잘 사용한다면, 코드의 재사용성과 유지보수성을 크게 향상시킬 수 있으며, 소프트웨어 개발의 생산성을 높일 수 있습니다.
- 공유 링크 만들기
- X
- 이메일
- 기타 앱