[Python] 24. 데코레이터
본 포스팅은 “윤성우의 열혈 파이썬 중급편” 책 내용을 기반으로 작성되었습니다. 잘못된 내용이 있을 경우 지적해 주시면 감사드리겠습니다.
24-1. 데코레이터에 대한 이해
def smile():
print("^_^")
def confused():
print("@_@")
def deco(func):
def df():
print('emotion!')
func()
print('emotion!')
return df
smile = deco(smile)
smile()
confused = deco(confused)
confused()
(결과) emotion!
^_^
emotion!
emotion!
@_@
emotion!
데코레이터 함수: smile과 confused 와 같이 기능을 추가해주는 함수
위 예에서는 데코레이터 함수가, 인자로 전달된 함수에 기능을 추가하는 방식으로 코드가 작성되었다.
24-2. 전달 인자가 있는 함수 기반의 데코레이터
def adder3(n1, n2, n3):
return n1 + n2 + n3
def adder_deco(func):
def ad(*args): # 튜플 패킹
print(*args, sep=' + ', end=' ') # 튜플 언패킹
print("= {0}".format(func(*args))) # 튜플 언패킹
return ad
adder3 = adder_deco(adder3)
adder3(1, 2, 3)
(결과) 1 + 2 + 3 = 6
24-3. @ 기반으로
이건 좀 충격적인 코드이다.
24-2 코드를 다음과 같이도 표현할 수 있다.
def adder_deco(func):
def ad(*args):
print(*args, sep=' + ', end=' ')
print("= {0}".format(func(*args)))
return ad
@adder_deco
def adder3(n1, n2, n3):
return n1 + n2 + n3
adder3(1, 2, 3)
(결과) 1 + 2 + 3 = 6
이렇게 해석 가능하다.
adder3 함수를 deco인 adder_deco에 전달하고, 이때 반한되는 함수를 다시 adder3에 담는다.
24-4. 데코레이터 함수 두 번 이상 통과하기
def deco1(func):
def inner():
print('deco1')
func()
return inner
def deco2(func):
def inner():
print('deco2')
func()
return inner
@deco1
@deco2
def simple():
print('simple')
simple()
(결과) deco1
deco2
simple
위 코드의 simple()은 다음과 같다.
simple = deco1(deco2(simple))
Leave a comment