Python
클래스를 이용하여 데커레이터 만들기
Dan-k
2021. 4. 15. 21:15
반응형
클래스로 데코레이터를 만드는 방법
클래스를 활용할 때는 인스턴스를 함수처럼 호출하게 해주는 __call__ 메서드를 이용하여 구현
class Trace:
def __init__(self, func): # 호출할 함수를 인스턴스의 초깃값으로 받음
self.func = func # 호출할 함수를 속성 func에 저장
def __call__(self):
print(self.func.__name__, '함수 시작') # __name__으로 함수 이름 출력
self.func() # 속성 func에 저장된 함수를 호출
print(self.func.__name__, '함수 끝')
@Trace # @데코레이터
def hello():
print('hello')
hello() # 함수를 그대로 호출
#======
hello 함수 시작
hello
hello 함수 끝
클래스의 인스턴스 자체를 호출할때 실행시키는 __call__ 메서드를 테커레이터로 이용하면 된다
클래스로 파라미터를 받을 수 있는 데커레이터 생성
class IsMultiple:
def __init__(self, x): # 데코레이터가 사용할 매개변수를 초깃값으로 받음
self.x = x # 매개변수를 속성 x에 저장
def __call__(self, func): # 호출할 함수를 매개변수로 받음
def wrapper(a, b): # 호출할 함수의 매개변수와 똑같이 지정(가변 인수로 작성해도 됨)
r = func(a, b) # func를 호출하고 반환값을 변수에 저장
if r % self.x == 0: # func의 반환값이 self.x의 배수인지 확인
print('{0}의 반환값은 {1}의 배수입니다.'.format(func.__name__, self.x))
else:
print('{0}의 반환값은 {1}의 배수가 아닙니다.'.format(func.__name__, self.x))
return r # func의 반환값을 반환
return wrapper # wrapper 함수 반환
@IsMultiple(3) # 데코레이터(인수)
def add(a, b):
return a + b
print(add(10, 20))
print(add(2, 5))
#=====
add의 반환값은 3의 배수입니다.
30
add의 반환값은 3의 배수가 아닙니다.
7
데커레이터를 클래스로 만들어 클래스의 인스턴스 값을 파라미터로 받아 속성을 가지고 감
wrapper function안에서 해당 속성을 이용해 데커레이터에서 받은 파라미터가 action을 취할 수 있도록 구성
출처 : dojang.io/mod/page/view.php?id=2431
파이썬 코딩 도장: 42.5 클래스로 매개변수와 반환값을 처리하는 데코레이터 만들기
지금까지 클래스로 데코레이터를 만들어보았습니다. 클래스로 만든 데코레이터도 매개변수와 반환값을 처리할 수 있습니다. 다음은 함수의 매개변수를 출력하는 데코레이터입니다(여기서는
dojang.io
728x90
반응형
LIST