프로그래밍/Python 관련 정보

[Pythonic Programming] Decorator

물박사의 저장공간 2024. 10. 27. 16:11

함수에 정수나 list 등의 자료형을 넣는 것은 굉장히 익숙하지만.. 함수의 인자로 '함수'가 들어간다면? 직접적으로 함수를 변수로서 담을 수도 있지만 가독성에 문제가 생길 수 있습니다. 이런 상황에서 decorator를 사용합니다. 

데코레이터는 함수를 인수로 받아 새로운 기능을 추가한 뒤, 원래 함수 대신 반환합니다.

def my_decorator(func):
    def wrapper():
        print("기능을 추가합니다.")
        func()  # 원래 함수를 실행
        print("추가 기능을 끝냅니다.")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

# 사용 예시
say_hello()
# 출력:
# 기능을 추가합니다.
# Hello!
# 추가 기능을 끝냅니다.

 

이런식으로 데코레이터를 만들면, say_hello()함수말고 다른 함수에도 이 추가기능(지금 여기서는 '기능을 추가합니다.', '추가 기능을 끝냅니다.'라는 문자열을 출력하는 기능이죠)을 쉽게 부여할 수 있습니다. 데코레이터를 사용하고 함수만 바꿔치기 하면 되기 때문입니다. 

데코레이터에 인자를 받아야할 경우도 있을텐데 이런 경우에는 아래와 같이 작성해주면 됩니다. 

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("함수 호출 전 추가 작업")
        result = func(*args, **kwargs)
        print("함수 호출 후 추가 작업")
        return result
    return wrapper

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

# 사용 예시
print(add(3, 4))
# 출력:
# 함수 호출 전 추가 작업
# 함수 호출 후 추가 작업
# 7