파이썬의 클래스 기반 데코레이터

Python decorator series의 이전 기사에서 우리는 간단한 함수 기반 데코레이터를 만드는 방법, 내부적으로 작동하는 방법 및 문서 문자열을 수정하는 방법을 배웠습니다.

이 기사에서는 클래스 기반 데코레이터를 만들고 이를 사용하여 함수를 장식하는 방법을 배웁니다.


class HelloDecorator:
    """Simple class decorator"""

    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        """Simple class call method"""
        print(f'Calling {self.func.__name__}')
        result = self.func(*args, **kwargs)
        return result


@HelloDecorator
def add(a, b):
    """Simple function that returns sum of two numbers"""
    return a + b


if __name__ == '__main__':
    output1 = add(2, 2)
    print('Result:: ', output1)




Calling add
Result::  4


좋습니다. 데코레이터를 작동시켰습니다. help, name 및 doc 속성을 살펴보겠습니다.

help(add) # --> prints class definition
print(add.__doc__) # --> prints Simple class decorator
print(add.__name__) # --> Raises AttributeError


문서 문자열을 수정해 보겠습니다.funct_tools.partial를 사용하여 get magic 메서드를 정의한 다음 funct_tools.update_wrapper를 사용하여 Python에 래핑된 함수를 알립니다.

from functools import update_wrapper, partial


class HelloDecorator:
    """Simple class decorator"""

    def __init__(self, func):
        self.func = func
        # fixes __name__ and __doc__ attributes
        update_wrapper(self, func)

    def __get__(self, obj):
        """Fixes help description"""
        return partial(self, obj)

    def __call__(self, *args, **kwargs):
        """Simple class call method"""
        print(f'Calling {self.func.__name__}')
        result = self.func(*args, **kwargs)
        return result


이제 문서를 확인하겠습니다.

help(add) # --> prints
"""
add(a, b)
    Simple function that returns sum of two numbers
"""
print(add.__doc__) # --> prints "add"
print(add.__name__) # --> prints "Simple function that returns sum of two numbers"


결론적으로 일부는 클래스 기반 데코레이터를 선호할 수 있지만 개인적으로 문서 문자열을 수정하기 위한 추가 상용구 코드 때문에 클래스 기반 데코레이터를 선호하지 않습니다.

다음 글에서는 다양한 종류의 데코레이터 레시피를 구현해 보겠습니다. 다가오는 기사를 계속 지켜봐주십시오. 내 미래 기사를 얻으려면 나와 연결하십시오.

좋은 웹페이지 즐겨찾기