매개변수가 있는 Python 데코레이터

Python decorator series 에 대한 이전 문서에서 데코레이터의 작동 방식과 간단한 함수 기반 데코레이터 및 클래스 기반 데코레이터를 구현하는 방법을 배웠습니다. 이 기사에서는 매개변수를 지원하는 데코레이터를 만드는 방법을 배웁니다.

매개변수가 있는 함수 기반 데코레이터




from functools import wraps


def hello_decorator(num):
    """Simple decorator function that supports parameters"""

    def inner_func(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            """Simple decorator wrapper function"""
            result = func(*args, **kwargs)
            result = result + num
            return result
        return wrapper
    return inner_func


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


@hello_decorator(200)
def multiply(a, b):
    """Simple function that returns multiplication of two numbers"""
    return a * b


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

    output2 = multiply(4, 2)
    print('Result:: ', output2)




보시다시피 구조는 이전 예제와 약간 다릅니다.
  • 데코레이터는 매개 변수를 사용합니다@hello_decorator(100) - 이것은 데코레이터에 인수를 전달할 수 있는 방법입니다
  • .
  • hello_decorator 함수가 내부 함수를 반환합니다.
  • inner_func는 장식할 함수를 인수로 사용하고 래퍼 함수를 ​​반환합니다.
  • 래퍼 함수는 add 함수를 실행하고 인수result = result + num를 기준으로 출력을 조작하고 최종 결과
  • 를 반환합니다.

    매개변수가 있는 클래스 기반 데코레이터




    from functools import wraps
    
    
    class HelloDecorator:
        """Simple class decorator"""
    
        def __init__(self, num):
            self.num = num
    
        def __call__(self, func):
            @wraps(func)
            def wrapper(*args, **kwargs):
                """Simple class call method"""
                result = func(*args, **kwargs)
                result = result + self.num
                return result
            return wrapper
    
    
    @HelloDecorator(100)
    def add(a, b):
        """Simple function that returns sum of two numbers"""
        return a + b
    
    
    @HelloDecorator(200)
    def multiply(a, b):
        """Simple function that returns multiplication of two numbers"""
        return a * b
    
    
    if __name__ == '__main__':
        output1 = add(2, 2)
        print('Result:: ', output1)
    
        output2 = multiply(4, 2)
        print('Result:: ', output2)
    


    매개변수가 있는 이 클래스 기반 데코레이터는 간단한 함수 기반 데코레이터와 매우 유사합니다. 이 방법의 가장 좋은 점은 문서 문자열을 수정하기 위해 추가 상용구 코드가 필요하지 않다는 것입니다.

    이제 인수가 있는 데코레이터를 구현하려면 클래스 기반 접근 방식을 선호합니다. 매우 직관적이고 추가 내부 기능과 문서에 대한 추가 상용구 코드 수정이 필요하지 않기 때문입니다.

    지금까지 예제를 통해 기본 데코레이터 구현을 다루었습니다. 다음 글에서는 다양한 종류의 데코레이터 레시피를 구현해 보겠습니다. 다가오는 기사를 계속 지켜봐주십시오. 뉴스레터를 구독하고 내 향후 기사를 받으려면 나와 연결하십시오.

    좋은 웹페이지 즐겨찾기