데코레이터

  • 장식자 라고도 함
  • 어떤 함수가 있을 때 해당 함수를 직접적으로 수정하지 않고 함수에 기능을 추가하고 싶을 때 사용
def hello():
    print("*"*10)
    print("hello")
    print("*"*10)
    
def hi():
    print("*"*10)
    print("hi")
    print("*"*10)

hello()
hi()
# 함수의 이름을 출력하고 앞 뒤로 *을 출력하는 기능이 있을 때
# 다른 함수도 시작과 끝에 *을 출력하려면 print를 계속 넣어야 하는 번거로움이 있음
# 이때 데코레이터를 사용
**********
hello
**********
**********
hi
**********

데코레이터 만들기

  • decorate() 함수는 함수를 인자로 받고, wrapper() 라는 함수를 선언
  • wrapper()함수는 decorate()함수의 인자로 넘어온 함수를 호출함
def decorate(func):
    def wrapper():
        print("*"*10)
        func()
        print("*"*10)
    return wrapper

def hello():
    print("hello")
def hi():
    print("hi")

hello = decorate(hello) # 데코레이터에 호출할 함수를 넣음
hello() # 반환된 함수를 호출
hi = decorate(hi)
hi()
**********
hello
**********
**********
hi
**********

데코레이터 사용

  • 호출할 함수 위에 @기호를 사용함
@decorate
def hello():
    print("hello")
hello()

@decorate
def hi():
    print("hi")
hi()
**********
hello
**********
**********
hi
**********

매개변수와 리턴값

def decorate(func): # 호출할 함수를 매개변수로 받음
    def wrapper(a, b):  # 호출할 함수의 매개변수와 똑같이 지정
def decorate(func):
    def wrapper(a, b):  # 호출한 함수의 매개변수와 동일하게 지정
        print(f"a값: {a}, b값: {b}, 더한값: {a+b}")
        value = func(a, b)
        return value
    return wrapper

@decorate
def add(a, b):
    return a + b

add(10, 20)

데코레이터
a값: 10, b값: 20, 더한값: 30





30

매개변수가 있는 데코레이터

def parm_decorate(x):   # 데코레이터가 사용할 매개변수 지정
    def decorate(func): # 호출할 함수를 매개변수로 받음
        def wrapper(a ,b):  # 호출할 함수의 매개변수와 똑같이 지정
def is_multiple(x):
    def real_decorator(func):
        def wrapper(a, b):    
            r = func(a, b)      
            if r % x == 0:    
                print(f'반환값은 {x}의 배수입니다.')
            else:
                print(f'반환값은 {x}의 배수가 아닙니다.')
            return r         
        return wrapper        
    return real_decorator      
 
@is_multiple(3)
def add(a, b):
    return a + b
 
print(add(10, 20))
print(add(2, 5))
반환값은 3의 배수입니다.
30
반환값은 3의 배수가 아닙니다.
7

클래스 데코레이터

  • 클래스로 데코레이터를 만들때는 __call__ 메서드를 구현해야 함
class Decorate:
    def __init__(self, func):
        self.func = func
    
    def __call__(self):
        print("*"*10)
        self.func()
        print("*"*10)

@Decorate
def hello():
    print("hello")
    
hello()
**********
hello
**********
  • 매개변수가 있는 클래스 데코레이터
class Decorate:
    def __init__(self, func):
        self.func = func
    def __call__(self, *args, **kwargs):
        result = self.func(*args, **kwargs)
        print(f"args={args}, kwargs={kwargs}, 값: {result}")
        return result

@Decorate
def add(a, b):
    return a + b

print(add(10, 20))
print(add(a=10, b=50))
args=(10, 20), kwargs={}, 값: 30
30
args=(), kwargs={'a': 10, 'b': 50}, 값: 60
60
class Decorate:
    def __init__(self, x):
        self.x = x
    def __call__(self, func):
        def wrapper(*args, **kwargs):
            func(*args, **kwargs)
        return wrapper
    
@Decorate(3)
def add(a, b):
    pass

카테고리:

업데이트:

댓글남기기