Python의 데코레이터는 함수에서 코드를 바꾸지 않고 수정 및 추가를 하고 싶을 때 활용할 수 있는 문법입니다. 또한 코드의 중복을 줄일 수 있는 방법으로도 사용할 수 있습니다.
def hello():
print('hello 시작')
print('hello')
print('hello 끝')
def world():
print('world 시작')
print('world')
print('world 시작')
예를 들어, 위처럼 함수의 시작과 끝을 알리고 싶다면 모든 함수에 print
을 활용하여 시작과 끝의 정보를 코딩해야 합니다. 이런 상황에서 데코레이터를 통해 코드의 중복을 줄여줄 수 있습니다.
def trace(func):
def wrapper():
print(func.__name__, '시작')
func()
print(func.__name__, '끝')
return wrapper
def hello():
print('hello')
def world():
print('world')
trace_hello = trace(hello)
trace_hello()
trace_world = trace(world)
trace_world()
데코레이터는 호출할 함수를 매겨변수로 받습니다. 그 안에는 호출할 함수를 감싸는 wrapper
를 만들어 사용할 수 있습니다. 이때 wrapper
의 이름은 자유롭게 사용해도 상관없습니다. wrapper
함수에는 함수의 시작과 끝을 알리는 기능을 추가와 trace
에서 매개변수로 받은 func
을 호출하도록 할 수 있습니다. 즉, trace
라는 외부 함수의 매개변수를 wrapper
가 참조함으로 외부 함수가 종료된 후에도 내부 함수가 외부 함수의 변수를 참조할 수 있도록 저장하는 클로저(Closure)입니다.
def trace(func):
def wrapper():
print(func.__name__, '시작')
func()
print(func.__name__, '끝')
return wrapper
@trace
def hello():
print('hello')
@trace
def world():
print('world')
hello()
world()
파이썬에서는 @
문법을 사용하여 간편하게 데코레이터를 사용할 수 있습니다.