본문 바로가기
대학원 공부/programming language

Python : decorater @

by 월곡동로봇팔 2020. 2. 20.

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

 

python decorator (데코레이터) 어렵지 않아요

Python decorator (데코레이터) Python 으로 작성된 Opensource 의 코드들을 보다 보면, 아래와 같이 @ 로 시작하는 구문 들을 볼 수 있다. @decorator_ def function(): print "what is decorator?" decorator를..

bluese05.tistory.com

https://leo-bb.tistory.com/49

 

[python]데코레이터(Decorator)

1. 데코레이터 클로저인데 인수가 함수인 부분이 차이가 있으며, 다양한 상황에서 동일한 기능을 수행하는 함수가 필요할 때 데코레이터를 만들어 사용하면 유리합니다. 일반적으로 로그를 남��

leo-bb.tistory.com

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)이라고 생각하면 된다.

댓글