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함수에 대한 가독성이 훨씬 좋아졌다. 간단히 @만 붙이면 같은 패턴을 여러번 재사용할 수 있다!
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()