[Python] 데코레이터

    데이코레이터 기능은 자동완성의 기본이다.

     

    앞에 설명했던 @staticmethod, @classmethod, @abstractmethod 또한 데코레이터다

    데코레이터는 @ 붙여서 실행한다.

     

     

    def trace(func):
        def wrapper():
            print(func.__name__, '함수 시작')
            func()
            print(func.__name__, '함수 끝')
        return wrapper
    
    def hello():
        print('hello')
    
    def world():
        print('world')
    
    
    trace_hello = trace(hello)
    trace_hello()
    trace_world = trace(world)
    trace_world()
    

    이너 함수를 이용해서 실험을 해보았다.

    이너함수 자체가 처음 본다면 이해하기 어렵지만, 결과적으로

    'hello'가 출력 되는 것을 확인 할 수 있다.

     

    def tracea(func):
        def wrapper():
            print(func.__name__, '함수 시작')
            func()
            print(func.__name__, '함수 끝')
        return wrapper
    
    @tracea
    def hello():
        print('hello')
    
    @tracea
    def world():
        print('world')
    
    hello()
    world()
    

    데코레이터를 사용할 경우 코드가 매우 간단해진다.

    데코레이터가 자동으로 tracea 함수를 찾아주기 때문이다.

     

     

    데코레이터 클래스 사용하기

    class Trace:
        def __init__(self, func):
            print('abc')
            self.func = func
    
        def __call__(self):
            print(self.func.__name__, '함수 시작')
            self.func()
            print(self.func.__name__, '함수 끝')
    
    @Trace
    def hello():
        print('hello')
    
    hello()
    

    데코레이터를 클래스 사용할 경우도 함수처럼 비슷하게 만들면 된다.

     

    __call__은 인스턴스 함수처럼 호출하게 해주는 메서드다.

    반응형

    'Language > Python' 카테고리의 다른 글

    [파이썬] 세션과 쿠키의 차이  (0) 2020.11.06
    [파이썬] get, post 방식 가져오기  (0) 2020.11.06
    [Python] 코루틴 사용하기  (1) 2020.10.19
    [Python] 예외처리하기  (0) 2020.10.19
    [Python] 클래스 상속하기  (0) 2020.10.16

    댓글

    Designed by JB FACTORY