조금씩 꾸준히 완성을 향해

[Python] Decorator 기본 개념 본문

Python/문법

[Python] Decorator 기본 개념

all_sound 2022. 9. 12. 10:37

decorator 는 함수, 메서드 또는 클래스 정의를 수정하는 데 사용되는 호출가능한 Python 객체이다. 일정 코드가 지속적으로 반복해서 등장하는 것을 함수화하여 축약하고자 등장한 파이썬의 기능이라고 생각하면 이해하기 쉽다.

 

 

예시를 통해 사용법을 알아보자. 

 

 

먼저 이렇게 각기 다른 명언이 담긴 4개의 함수가 있다.

def quote_1():
    print("I'm as proud of what we don't do as I am of what we do.")
def quote_2():
    print("The journey is the reward.")
def quote_3():
    print("Innovation distinguishes between a leader and a follower.")
def quote_4():
    print("Quality is more important than quantity. One home run is much better than two doubles.")

 

그런데 뒤늦게 이 명언의 저작권을 함께 표기해야 한다고 생각해 보자. 

def quote_1():
    print("@ Steve Jobs")
    print("I'm as proud of what we don't do as I am of what we do.")
def quote_2():
    print("@ Steve Jobs")
    print("The journey is the reward.")
def quote_3():
    print("@ Steve Jobs")
    print("Innovation distinguishes between a leader and a follower.")
def quote_4():
    print("@ Steve Jobs")
    print("Quality is more important than quantity. One home run is much better than two doubles.")

함수의 개수가 적다면 이렇게 일일히 함수를 수정해볼 수 있을 것이다.

 

그러나 함수의 개수가 정말 많고, 수정할 내용도 훨씬 방대하다면 더 효율적인 방법을 생각해 봐야 한다. 

 

 

그게 바로 함수 재정의이다.

def copyright(func):  #기존의 함수를 수정해 주는 새 함수
    def new_func():
        print("@ Steve Jobs")
        func()
    return new_func

def quote_1():
    print("I'm as proud of what we don't do as I am of what we do.")
def quote_2():
    print("The journey is the reward.")
def quote_3():
    print("Innovation distinguishes between a leader and a follower.")
def quote_4():
    print("Quality is more important than quantity. One home run is much better than two doubles.")

quote_1 = copyright(quote_1) #함수 재정의
quote_2 = copyright(quote_2)
quote_3 = copyright(quote_3)
quote_4 = copyright(quote_4)

quote_1() #재정의된 함수 호출
quote_2()
quote_3()
quote_4()

기존의 함수를 인자로 받는 새로운 함수를 만들어, 각각의 함수를 재정의 한 다음 호출하면 우리가 원하는 결과를 얻을 수 있다. 

 

 

여기서 한 발짝 더 나아간 방법이 바로 decorator이다.

def copyright(func):
    def new_func():
        print("@ Steve Jobs")
        func()
    return new_func

@copyright
def quote_1():
    print("I'm as proud of what we don't do as I am of what we do.")
    
@copyright
def quote_2():
    print("The journey is the reward.")
    
@copyright
def quote_3():
    print("Innovation distinguishes between a leader and a follower.")
    
@copyright
def quote_4():
    print("Quality is more important than quantity. One home run is much better than two doubles.")

quote_1()
quote_2()
quote_3()
quote_4()

함수를 일일히 재정의하는 대신 인자로 넣을 함수 바로 위에 '@함수명'을 붙이면 아주 간단하게 재정의가 완료된다. 

 

결과도 이렇게 잘 출력되는 것을 확인할 수 있다.