1 minute read

본 포스팅은 “윤성우의 열혈 파이썬 중급편” 책 내용을 기반으로 작성되었습니다. 잘못된 내용이 있을 경우 지적해 주시면 감사드리겠습니다.

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