Decorator란
- Closure처럼
중첩함수
를 return하는 함수이다.- 다른 함수에 적용해서, 적용된 함수가 실행되기 전에
무조건 먼저 실행
이 된다.- 즉, 적용된 특정 함수가 실행되기 전에
강제적으로 다른 함수가 실행이 된 후에 실행
되도록 하는 강제성을 가지는 기능이다.- 특정 함수 위에
'@함수명'
의 형태로 사용된다.
def decorator_func(func):
def wrapper():
print("decorator_func 작동")
print(func())
return wrapper
@decorator_func
def any_func():
return "any_func 작동"
any_func()
함수를 parameter로 받고, wrapper라는 내부함수를 가지고 return하는 decorator_func 함수가 있다.
wrapper함수는 decorator_func의 parameter함수를 실행 후 출력한다.
any_func함수 위에, @decorator_func가 장식처럼 쓰여지고 있다.
때문에 장식자
= decorator라는 이름으로 불린다.
해당 코드를 실행하면,
decorator_func 작동
any_func 작동
으로 결과값이 나온다.
any_func함수가 실행이 되기전에 decorator_func가 먼저 실행이 된 것을 알 수 있다.
any_func를 호출 할 때, 파이썬이 자동적으로
deco_result = decorator_func(any_func)
deco_result()
로 변환해서 호출한다.
위 코드는 고정된 값을 호출하는 함수로 되어있다.
하지만 @함수명(param)
의 형식으로 parameter를 받는 형식으로 작성할 수 있다.
def join_name(name):
def first(func):
def second():
print(func() + name + "!")
return second
return first
@join_name("Water")
def welcome():
return "Welcome, "
welcome()
# 결과값 -> Welcome Water!
앞서 보았던 예시와는 다르게 3가지 함수가 중첩되어 있다.
join_name함수
,first함수
,second함수
로 이루어져 있다.하나하나 살펴보면 앞서 본 예시와 크게 차이는 없다.
하지만 함수를 한번 더 씌워주면서 아래와 같이 유동적인 결과를 나타낼 수 있다.
# @join_name( 위 코드에서 여기만 변경한 후 출력 )
@join_name("Enjoywater")
...
# 결과값 -> Welcome Enjoywater!
@join_name("Lee")
...
# 결과값 -> Welcome Lee!
이와같은 코드는 파이썬이 실행 할 때,
pre_result = join_name("Water")
result = pre_result(welcome)
result()
로 변환해서 호출하게 된다.
또한, 결과를 호출하는 welcome함수에 parameter를 받아서 더 편리하게도 사용할 수 있다.
def join_name(greet):
def first(func):
def second(name):
print(greet + func(name) + "!")
return second
return first
@join_name("Welcome ")
def welcome(name):
return name
welcome("Water")
# 결과값 -> Welcome Water!
이렇게 코드가 변경되면,
!
를 제외한 나머지 인사말과 이름을 변경하며 출력할 수 있게된다.