반응형

decorator란 다른 함수를 반환하는 함수인데, @wrapper 문법을 사용하여 대게는 함수를 변환하는 형태로 적용된다.

다음 예시는 그냥 쓰는 방법과 @으로 데코레이터를 쓰는 방법이다.

def formatter(func):
    def wrapper():
        print("Function Start")
        func()
        print("Function End")
    return wrapper

def foo():
    print("foo")

@formatter
def boo():
    print("boo")

if __name__ == "__main__":
    print('그냥 쓰기')
    foo()
    print('넣어서 쓰기')
    decorated_foo = formatter(foo)
    decorated_foo()
    print('@으로 데코레이터 쓰기')
    boo()

 

가변 인수를 사용하는 데코레이터

def formatter(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        print("Sum is {}".format(result))

        return result
    return wrapper

@formatter
def sum(a, b):
    return a+b
    
print('더해보기')
sum(3,4)
sum(5,8)
sum(1,1)

 

 

클래스 내에서 가변 인수를 사용하는 데코레이터

def formatter(func):
    def wrapper(self, *args, **kwargs):
        result = func(self, *args, **kwargs)
        print("Sum is {}".format(result))
        return result
    return wrapper

@formatter
def sum(a, b):
    return a+b
    
print('더해보기')
sum(3,4)
sum(5,8)
sum(1,1)

 

[1] Python Documentation, https://docs.python.org/3/glossary.html

[2] 코딩도장, "Unit.42. 데코레이터 사용하기," https://dojang.io/mod/page/view.php?id=2427 

[3] jiffydev, "TIL 6. Decorator," https://velog.io/@jiffydev/TIL-6.-Decorator

** EOF **

 

 

728x90

+ Recent posts