728x90
데코레이터는 함수의 기능을 확장할 수 있는 강력한 도구이며, 중첩 적용도 가능합니다. 또한 데코레이터 자체에 인자를 전달하면 다양한 동작을 동적으로 제어할 수 있습니다. 이 장에서는 중첩 데코레이터와 인자 있는 데코레이터 구현 방법을 소개합니다.
● 데코레이터 중첩 사용
하나의 함수에 여러 데코레이터를 적용하면 아래쪽 데코레이터부터 순차적으로 실행됩니다.
def deco1(func):
def wrapper(*args, **kwargs):
print("deco1 시작")
result = func(*args, **kwargs)
print("deco1 끝")
return result
return wrapper
def deco2(func):
def wrapper(*args, **kwargs):
print("deco2 시작")
result = func(*args, **kwargs)
print("deco2 끝")
return result
return wrapper
@deco1
@deco2
def hello():
print("Hello")
hello()
출력 순서는 deco1 → deco2 → hello → deco2 끝 → deco1 끝 순입니다.
● 인자 있는 데코레이터 만들기
데코레이터에 인자를 전달하려면 함수 3중 구조로 작성해야 합니다.
def tag_decorator(tag):
def outer(func):
def wrapper(*args, **kwargs):
print(f"<{tag}>")
result = func(*args, **kwargs)
print(f"</{tag}>")
return result
return wrapper
return outer
@tag_decorator("b")
def greet():
print("Hello")
greet()
tag 값을 바꾸면 동적으로 동작을 제어할 수 있는 유연한 데코레이터가 완성됩니다.
● functools.wraps 사용
중첩이나 인자 있는 데코레이터를 사용할 때는 functools.wraps
를 활용하여 원래 함수 이름과 docstring을 유지해야 합니다.
from functools import wraps
def deco(func):
@wraps(func)
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper
● 마무리
데코레이터는 반복되는 코드 구조를 줄이고, 함수의 동작을 유연하게 확장하는 데 매우 적합합니다. 중첩 구조와 인자 전달을 통해 조건에 따라 기능을 제어하는 고급 데코레이터 패턴을 활용해보시기 바랍니다.
728x90
'프로그래밍언어 > 파이썬[중급]' 카테고리의 다른 글
[파이썬][중급] Chapter33. functools 주요 기능 살펴보기 (0) | 2025.05.24 |
---|---|
[파이썬][중급] Chapter32. itertools 고급 패턴 (0) | 2025.05.24 |
[파이썬][중급] Chapter30. 고차 함수와 partial 함수 (0) | 2025.05.23 |
[파이썬][중급] Chapter29. 타입 힌트와 함수 주석 (0) | 2025.05.23 |
[파이썬][중급] Chapter28. 비동기 파일 및 네트워크 처리 (0) | 2025.05.23 |