728x90

데코레이터 (Decorator)


함수 앞뒤에 기능을 추가해서 손쉽게 함수를 활용할 수 있는 기법

혹시 다음과 같이 @가 사용된 파이썬 코드를 본 적이 있으신지?

@decorator_func
def function():
    print("what is decorator?")


위 코드에서 @decorator_func 부분이 데코레이터임

 

def logger_login():
    print("Dave login")

logger_login()

 

시간을 앞뒤로 추가하고 싶다.


이렇게 넣으면 됩니다.

 

import datetime


def logger_login():
    print(datetime.datetime.now())
    print("Dave login")
    print(datetime.datetime.now())


logger_login()

 

 

똑같은 기능을 앞뒤로 가지고 있을때 중간의 기능이 바뀌는 많은 함수들을 만들어야 할때


직접 각 함수에 기능을 앞뒤로 코드로 넣어도 되긴 되지 않을까?

여러 함수에 동일한 기능을 @데코레이터 하나로 간편하게 추가할 수 있고,


예를 들어, 파라미터가 있는 함수에 파라미터의 유효성 검사가 필요할 때


파라미터가 있는 함수가 있을 때마다, 유효성 검사 코드를 넣기가 불편!


만약 유효성 검사 코드 수정이 필요하다면 관련 함수를 모두 수정해야 하므로 매우 불편

 

 

# 데코레이터 작성하기
def datetime_decorator(func):                               # <--- datetime_decorator 는 데코레이터 이름, func 가 이함수 안에 넣을 함수가 됨
    def wrapper():                                          # <--- 호출할 함수를 감싸는 함수
        print('time %s' % str(datetime.datetime.now()))     # <--- 함수 앞에서 실행할 내용
        func()                                              # <--- 함수
        print(datetime.datetime.now())                      # <--- 함수 뒤에서 실행할 내용
    return wrapper                                          # <--- closure 함수로 만든다.

 

# 데코레이터 적용하기
# 쉽게 설명하면 데커레이터 함수의 parameter로 데커레이터 된 함수의 객체가 전달된다.
@datetime_decorator
def logger_login_david():
    print('David login')

logger_login_david()

 

파라미터가 있는 함수에 Decorator 적용하기


중첩 함수에 꾸미고자 하는 함수와 동일하게 파라미터를 가져가면 됨

 

# 데코레이터
def outer_func(func):
    def inner_func(digit1, digit2):
        func(digit1, digit2)
        if digit2 == 7:
            print("행운!")
        else:
            print("미당첨 ㅠ")
    return inner_func

@outer_func
def lucky(num1 ,num2):
    print("이번주 번호는: %s, %s" % (num1, num2))

from random import choice

num_list = range(0, 10)
for i in range(10):
    A = choice(num_list)
    B = choice(num_list)
    lucky(A, B)

 

728x90