함수(메서드)를 장식하는 데코레이터
함수의 시작과 끝 시간을 출력하는 데코레이터
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()
Author And Source
이 문제에 관하여(함수(메서드)를 장식하는 데코레이터), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@yeonnex/함수메서드를-장식하는-데코레이터저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)