Decorater 데코레이터
목적
> 어떤 class나 함수에 기본을 지킨 상태로 code를 추가하고 싶을 때, 주로 사용한다.
> @ 뒤에 함수이름이나 class 이름을 붙여주면 된다. 붙여줄 때는 def 함수로 보통 사용한다.
예시 - 1 (함수를 decorater로 받은 경우)
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"
위의 code를 보면, date_time_decorator 함수를 정의한 것을 보면, decorator를 쓸 함수의 형태를 나타낸 것이다.
decorator를 쓰지 않을 경우, print(datetime.datetime.now())를 두번 더 써줘야하기 때문에, 만약 같은 출력 형태를 듸는 function이 여러개 일 경우, code가 가독성이 굉장히 떨어지게 된다.
따라서 decorator로 형태를 잡아주고, 형태가 동일한 function을 정의할 경우, @decorator의 형태를 가지는 funciton의 이름을 적어주면, decorator의 형태를 가진 function으로 쓸 수 있다.
예시 - 2 (class를 decorater로 받은 경우)
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_function_1():
print "MAIN FUNCTION 1 START"
@DatetimeDecorator
def main_function_2():
print "MAIN FUNCTION 2 START"
@DatetimeDecorator
def main_function_3():
print "MAIN FUNCTION 3 START"
my = MainClass()
my.main_function_1()
my.main_function_2()
my.main_function_3()
https://bluese05.tistory.com/30?category=559959
decorater는 기존 function or class를 그대로 유지한 채로 추가로 code를 개조하는 방법이다.
위의 예시 2번째가 제일 좋은 예시이다.
class DatetimeDecorator 는 f를 self.func로 받고 있으며
Decorater @을 쓰면 @DatatimeDecorator def main_function_1( ) 이라면, main_function_1() = class DatatimeDecorator(main_function_1() = func)이라고 생각하면 된다.
'대학원 공부 > programming language' 카테고리의 다른 글
Numpy : np.diag (대각선 요소의 값만 추출한 배열 구하기) (0) | 2020.02.21 |
---|---|
Numpy : np.reshape, flatten, ravel, newaxis (차원 변경) (0) | 2020.02.21 |
Pandas : DataFrame vs Series (0) | 2020.02.04 |
Pandas : DataFrame.difference (0) | 2020.02.04 |
Pandas : DataFrame axis (0) | 2020.02.04 |
댓글