5.1 데코레이터 소개
데코레이터는 다른 함수를 인자로 받아 새 함수를 반환하는 함수야. 본래 함수의 행동을 변경하거나 확장해. 데코레이터는 코드의 가독성과 재사용성을 높이는데 사용돼.
데코레이터는 함수나 메소드의 소스 코드를 변경하지 않고 행동을 수정할 수 있게 해줘. 그래서 기능 추가, 로깅, 접근 제어 등의 작업에 널리 쓰여.
Python의 데코레이터 문법은 기호 @를 데코레이터 이름 앞에 사용해. 이 기호는 함수 정의 앞에 위치해.
@decorator
def my_function():
pass
다음 코드와 동일해:
def my_function():
pass
my_function = decorator(my_function)
여기서 무슨 일이 일어나는지 잘 생각해봐: 우리는 my_function 함수를 정의한 다음 decorator 함수로 교체해. 이때 decorator 함수는 우리 함수가 매개 변수로 전달돼. decorator 함수는 원하는 대로 우리 함수를 호출할 수 있어.
5.2 간단한 데코레이터 만들기
함수 호출 전과 후에 메시지를 출력하는 간단한 데코레이터를 만들어보자.
def my_decorator(func):
def wrapper():
print("함수 호출 전")
func()
print("함수 호출 후")
return wrapper
@my_decorator
def say_hello():
print("Hello!")
say_hello()
설명
데코레이터 (my_decorator): 이 함수는 함수 func를 인자로 받고, func를 호출하면서 호출 전후로 추가 행동을 더하는 새로운 함수 wrapper를 반환해.
데코레이터가 있는 함수 (say_hello): 함수 say_hello는 데코레이터 my_decorator로 감싸져서 호출 시 추가 행동이 더해져.
출력:
# 함수 호출 전
Hello!
# 함수 호출 후
5.3 인자를 받는 데코레이터
데코레이터는 인자를 받아서 보다 유연하게 설정할 수 있어.
def repeat(num_times):
def decorator_repeat(func):
def wrapper(*args, **kwargs):
for _ in range(num_times):
func(*args, **kwargs)
return wrapper
return decorator_repeat
@repeat(num_times=3)
def say_hello(name):
print(f"Hello, {name}!")
say_hello("Alice")
설명
인자가 있는 데코레이터 (repeat): 이 함수는 num_times 인자를 받고 데코레이터 decorator_repeat를 반환해.
데코레이터 (decorator_repeat): 이 데코레이터는 함수 func를 받아 func를 num_times 횟수만큼 호출하는 새로운 함수 wrapper를 반환해.
데코레이터가 있는 함수 (say_hello): 함수 say_hello는 데코레이터 repeat 덕분에 세 번 호출돼.
출력:
Hello, Alice!
Hello, Alice!
Hello, Alice!
GO TO FULL VERSION