Python 데코레이터 (Decorators)Language/Python2023. 10. 28. 12:58
Table of Contents
데코레이터(decorators)는 Python에서 함수나 메서드의 동작을 수정하거나 확장할 수 있는 강력한 기능입니다. 이 글에서는 데코레이터의 개념, 기본적인 사용법, 다양한 예제를 통해 실용적인 사용법을 설명하겠습니다.
데코레이터란 무엇인가?
Python의 데코레이터는 다른 함수를 감싸는 함수입니다. 주로, 기존 함수에 새로운 기능을 추가하거나, 동작을 변경하고 싶을 때 사용됩니다. Python에서 데코레이터는 @ 기호를 사용하여 정의합니다.
기본 구조
데코레이터는 보통 다음과 같은 구조를 가집니다:
def decorator_function(original_function):
def wrapper_function(*args, **kwargs):
print(f"{original_function.__name__} 함수가 호출되기 전")
result = original_function(*args, **kwargs)
print(f"{original_function.__name__} 함수가 호출된 후")
return result
return wrapper_function
데코레이터 적용
@decorator_function을 사용하여 기존 함수에 데코레이터를 적용할 수 있습니다:
@decorator_function
def say_hello(name):
print(f"안녕하세요, {name}님!")
say_hello("철수")
출력 결과는 다음과 같습니다:
say_hello 함수가 호출되기 전
안녕하세요, 철수님!
say_hello 함수가 호출된 후
데코레이터의 실제 사용 예제
1. 실행 시간 측정
데코레이터를 사용하여 함수의 실행 시간을 측정할 수 있습니다.
import time
def timer_decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"{func.__name__} 실행 시간: {end_time - start_time:.2f}초")
return result
return wrapper
@timer_decorator
def calculate_sum(numbers):
return sum(numbers)
numbers = range(1, 1000000)
calculate_sum(numbers)
2. 접근 제어
예를 들어, 인증이 필요한 함수를 만들 때 유용합니다.
def authentication_required(func):
def wrapper(user_authenticated, *args, **kwargs):
if not user_authenticated:
print("접근 권한이 없습니다!")
return
return func(*args, **kwargs)
return wrapper
@authentication_required
def view_sensitive_data(user_authenticated, data):
print(f"민감한 데이터: {data}")
# 인증된 사용자
view_sensitive_data(True, "기밀 문서")
# 인증되지 않은 사용자
view_sensitive_data(False, "기밀 문서")
3. 로깅 데코레이터
데코레이터를 이용해 함수 호출을 기록(log)할 수 있습니다.
def logging_decorator(func):
def wrapper(*args, **kwargs):
print(f"'{func.__name__}' 함수가 호출되었습니다. 인자: {args}, {kwargs}")
return func(*args, **kwargs)
return wrapper
@logging_decorator
def add(a, b):
return a + b
result = add(5, 3)
print(f"결과: {result}")
출력:
'add' 함수가 호출되었습니다. 인자: (5, 3), {}
결과: 8
클래스 데코레이터
데코레이터는 클래스에도 적용할 수 있습니다.
1. 클래스 메서드 로깅
클래스의 모든 메서드를 감싸는 데코레이터를 사용할 수 있습니다.
def method_logger(cls):
class WrappedClass:
def __init__(self, *args, **kwargs):
self.wrapped_instance = cls(*args, **kwargs)
def __getattr__(self, name):
attr = getattr(self.wrapped_instance, name)
if callable(attr):
def logged_method(*args, **kwargs):
print(f"'{name}' 메서드가 호출되었습니다.")
return attr(*args, **kwargs)
return logged_method
return attr
return WrappedClass
@method_logger
class Calculator:
def add(self, a, b):
return a + b
def multiply(self, a, b):
return a * b
calc = Calculator()
print(calc.add(2, 3))
print(calc.multiply(3, 4))
여러 데코레이터의 조합
여러 데코레이터를 한 함수에 적용할 수 있습니다. 이 경우, 데코레이터는 아래에서 위로 실행됩니다.
def decorator_one(func):
def wrapper(*args, **kwargs):
print("첫 번째 데코레이터 동작")
return func(*args, **kwargs)
return wrapper
def decorator_two(func):
def wrapper(*args, **kwargs):
print("두 번째 데코레이터 동작")
return func(*args, **kwargs)
return wrapper
@decorator_one
@decorator_two
def greet(name):
print(f"안녕하세요, {name}님!")
greet("영희")
출력:
첫 번째 데코레이터 동작
두 번째 데코레이터 동작
안녕하세요, 영희님!

'Language > Python' 카테고리의 다른 글
| Python context manager (with의 동작 원리) (0) | 2023.10.29 |
|---|---|
| Python 이터레이터와 제너레이터 (0) | 2023.10.27 |
| Python 예외 처리(Exception, try-except) (0) | 2023.10.26 |
| Python 모듈(module)과 패키지(package) (0) | 2023.10.25 |
| Python 객체지향 프로그래밍 (OOP) (0) | 2023.10.24 |