클래스 데코레이터 패턴 학습

python에서 클래스 데코레이터 패턴이라는 것이 있다.

우선 데코레이터란

def simple_decorator(func):
    def wrapper():
        """나는 래퍼(wrapper)의 독스트링입니다."""
        print("Wrapper 실행")
        return func()
    return wrapper

@simple_decorator
def original_function():
    """나는 원본 함수의 소중한 독스트링입니다."""
    print("원본 함수 실행")

print("함수 이름:", original_function.__name__)
print("독스트링:", original_function.__doc__)

와 같이 어떤 다른 함수를 래핑하여 함수의 기능을 확장해준다.

클래스 데코레이터 패턴은

import numpy as np
import functools
version = np.__version__
if int(version.split('.')[0]) >= 2:
    print(f"numpy version is above 2: {version}")
    

class Decorator():
    def __init__(self, name):
        self.name = name
    
    
    def __call__(self, func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            print(f"{self.name}으로 래핑하여 함수 실행")
            res = func(*args, **kwargs)
            return res
        
        return wrapper
    
    
@Decorator(name = "테스트")
def getNumpyMatrix(*args, row, col):
    try:
        res = np.array(*args)
        return res.reshape(row, col)
    except Exception as e:
        print(f"{e}")



my_data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
result = getNumpyMatrix(my_data, row=3, col=3)  
print(result)

와 같이 클래스를 데코레이터 처럼 쓸 수 있다.

@Decorator(name = "테스트")
def func(*args, **kwargs):
    pass

생성자가 호출되어 인스턴스가 생성되고

그 다음에 __call__()이 호출된다.

따라서 래퍼함수에 인자가 전달되고 함수를 실행함으로써 함수를 확장할 수 있다.