Python의 데코레이터는 함수나 메서드의 동작을 수정하거나 확장하는 강력한 도구입니다. 데코레이터를 이용하면 기존의 코드를 변경하지 않고도, 추가적인 기능을 쉽게 통합할 수 있습니다. 이 글에서는 Python의 데코레이터에 대한 개념을 소개하고, 간단한 예제를 통해 데코레이터를 어떻게 사용하는지 설명하겠습니다.
데코레이터의 기본 개념
데코레이터는 다른 함수를 인자로 받는 호출 가능한 객체(함수 또는 클래스)입니다. 데코레이터는 함수의 실행을 감싸는 형태로 동작하여, 함수 호출 전후에 추가적인 처리를 할 수 있게 합니다. Python에서는 @ 심볼을 사용하여 데코레이터를 함수에 적용합니다.
간단한 데코레이터 예제
아래는 함수 실행 시간을 측정하는 간단한 데코레이터의 예입니다. 이 데코레이터는 데코레이팅된 함수가 실행되는 데 걸리는 시간을 출력합니다.
import time
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"Executing {func.__name__} took {end_time - start_time} seconds.")
return result
return wrapper
@timer
def example_function(x):
return sum([i*i for i in range(x)])
print(example_function(100000))
이 예제에서 timer 데코레이터는 example_function 함수를 감싸며, 해당 함수가 실행되기 전후의 시간을 측정하여 총 실행 시간을 출력합니다.
데코레이터의 활용
데코레이터는 로깅, 접근 제어, 리소스 관리, 캐싱 등 다양한 분야에서 유용하게 사용됩니다. 예를 들어, 웹 애플리케이션에서 특정 경로의 접근을 제한하는 데코레이터를 만들 수 있습니다.
def authorize(func):
def wrapper(*args, **kwargs):
user = kwargs.get('user')
if user is not None and user.is_admin:
return func(*args, **kwargs)
else:
raise Exception("Unauthorized")
return wrapper
@authorize
def delete_user(user):
print("User deleted")
# 사용 예
user = User(is_admin=True)
delete_user(user=user)
데코레이터 스택
여러 데코레이터를 하나의 함수에 적용할 수 있습니다. 이 경우 데코레이터는 위에서부터 아래로 적용되며, 실행되는 순서는 아래에서 위로 진행됩니다
@decorator1
@decorator2
def some_function():
pass
위 코드에서 decorator2가 먼저 적용되고, 그 다음 decorator1이 적용됩니다.
결론
Python의 데코레이터는 코드의 재사용성을 높이고, 함수의 기능을 확장할 수 있는 유용한 도구입니다. 데코레이터를 통해 프로그램의 유지 관리가 용이해지며, 코드를 보다 깔끔하게 관리할 수 있습니다. 실제 개발 환경에서 데코레이터를 적극 활용해 보면, 그 효용성을 직접 느낄 수 있을 것입니다.
'Python' 카테고리의 다른 글
Python 모듈 만들기와 활용 방법: 코드 재사용 및 조직화 (20) | 2024.05.13 |
---|---|
Python 컴프리헨션 사용법: 리스트, 딕셔너리, 세트 (34) | 2024.05.12 |
Python에서 제너레이터(Generator) 활용하기: 효율적인 데이터 처리 (30) | 2024.05.11 |
Python에서 상속과 다형성 이해하기 (33) | 2024.05.11 |
Python에서 클래스와 객체 지향 프로그래밍 이해하기 (33) | 2024.05.10 |