[WAFFLE] 01-3 Decorator

1 minute read

Published:

In this post, basic concepts about Decorator is introduced.

Decorator

Python 데코레이터는 함수나 메서드의 동작을 변경하거나 확장할 수 있는 고급 기능이다. 데코레이터는 다른 함수를 감싸는 함수로, 하나의 함수(혹은 클래스)를 입력으로 받아 새로운 함수를 반환합니다. 이는 코드의 재사용성을 높이고, 중복을 줄이며, 가독성을 향상시키는 데 유용하다.

Decorator Structure

def decorator_function(original_function):
    def wrapper_function(*args, **kwargs):
        # 동작 추가 (Before)
        print(f"{original_function.__name__} 함수가 호출되었습니다.")
        
        result = original_function(*args, **kwargs)
        
        # 동작 추가 (After)
        print(f"{original_function.__name__} 함수 호출이 완료되었습니다.")
        
        return result
    return wrapper_function

@decorator_function
def display_info(name, age):
    print(f"이름: {name}, 나이: {age}")

# 호출
display_info("홍길동", 30) // 이 호출에 해당하는 부분을 FastAPI pydantic에선 자동으로 해줌.
display_info 함수가 호출되었습니다.
이름: 홍길동, 나이: 30
display_info 함수 호출이 완료되었습니다.
  1. decorator 적용 단계
    • @decorator_function은 python이 자동으로 다음과 같이 바꾼다.
      display_info = decorator_function(display_info)
      
    • 이 호출의 결과로, decorator_function은 원래의 display_info 함수를 인수로 받고, wrapper_function을 반환한다.
    • 결과적으로 display_info 변수는 더 이상 원래의 display_info 함수를 가리키지 않고, wrapper_function을 가리킨다.
  2. 함수 호춮 단계
    • 이제 display_info(“홍길동”, 30)을 호출하면, 실제로는 wrapper_function(“홍길동”, 30)이 호출된다.
    • wrapper_function 안에서 original_function이 호출되며, 여기서 original_function은 원래의 display_info 함수이다.
  • 입력 함수: 데코레이터는 원래의 함수를 인자로 받습니다.
  • 래퍼(wrapper) 함수: 입력 함수의 동작을 확장하거나 수정할 코드를 포함합니다.
  • 반환 함수: 새로운 동작이 추가된 함수를 반환합니다.

데코레이터는 입력 함수를 받아서 포장된 함수(wrapper function)를 생성하고 반환한다. 이 과정은 팩토리에서 객체를 생성하는 방식과 매우 유사하다. 그러나, 데코레이터 함수에서 꼭 다른 함수만을 return 값으로 주는 것은 아니다.

Leave a Comment