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__()이 호출된다.
따라서 래퍼함수에 인자가 전달되고 함수를 실행함으로써 함수를 확장할 수 있다.
