함수(메서드)를 장식하는 데코레이터

7153 단어 pythonpython

함수의 시작과 끝 시간을 출력하는 데코레이터

import datetime
def datetime_decorator(func):
    def decorated():
        print(datetime.datetime.now())
        func()
        print(datetime.datetime.now())
    return decorated
@datetime_decorator
def main_function_1():
    print("MAIN FUNCTION 1 START")

@datetime_decorator
def main_function_2():
    print("MAIN FUNCTION 2 START")

@datetime_decorator
def main_function_3():
    print("MAIN FUNCTION 3 START")


main_function_1()
print("="*25)
main_function_2()
print("="*25)
main_function_3()

decorator함수를 재사용함으로써, main함수에 대한 가독성이 훨씬 좋아졌다. 간단히 @만 붙이면 같은 패턴을 여러번 재사용할 수 있다!

  • 먼저, decorator 역할을 하는 함수를 정의하고, 이 함수에서 decorator가 적용될 함수를 인자로받는다. python은 함수의 인자로 다른 함수를 받을 수 있다는 특징을 이용하는 것이다.
  • decorator 역할을 하는 함수 내부에 또 한번 함수를 선언(nested function)하여 여기에 추가하고 싶은 작업 (시간 출력)을 선언해준다.
  • nested 함수를 return해주면 된다.

decorator는 원래 작업의 앞뒤에 추가적인 작업을 해주는 것이지, 대상함수의 수행 중간에 끼어드는 구문은 할 수 없다.

class 형태로 decorator를 사용해보자
decorator를 class로 사용하고 싶다면, call 함수로 decorator 형식을 정의해주면 된다.
class의 call 함수로 정의해주는게 nested 함수로 정의한 것보다 더 깔끔해보임..!

import datetime
class DatetimeDecorator:
        def __init__(self, f):
            self.func = f
        
        def __call__(self, *args, **kwargs):
            print(datetime.datetime.now())
            self.func(*args, **kwargs)
            print(datetime.datetime.now())

class MainClass:
    @DatetimeDecorator
    def main_func_1():
        print("main func 1 start!")
    
    @DatetimeDecorator
    def main_func_2():
        print("main func 2 start!")

my = MainClass()
my.main_func_1()

좋은 웹페이지 즐겨찾기