데이터과학 삼학년

클래스를 이용하여 데커레이터 만들기 본문

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
Comments