본문 바로가기
파이썬 (Python)/General

파이썬 - 함수 데코레이터(decorator), 클래스 데코레이터(decorator)

by ★√★ 2021. 3. 5.

오늘 포스팅은 python에서 꾸며주는 기능을 하는 데코레이터(decorator)에 대한 내용입니다. 반복적인 코드를 줄여서 표현이 가능합니다. 만드는 방법에 따라 함수 데코레이터와 클래스 데코레이터로 나눌 수 있습니다. 

 

 

데코레이터
데코레이터

 

 그럼 함수 데코레이터, 클래스 데코레이터 이렇게 두개로 나눠서 설명 해드리도록 하겠습니다.

 

함수 데코레이터

: 함수에 사용하는 데코레이터라고 생각하시면 됩니다. 실행할려고 하는 함수 앞에  '@데코레이터이름' 이런 형식으로 선언을 하게

되면 함수가 실행이 될 때 데코레이터로 선언한 내용에 대해서 실행이 같이 되는 기능입니다. 쉬운 예를 들기 위해서 아래와 같은 예제 구문을 준비하였습니다. 

 

 아래 코드는 hello test_child 함수를 실행할 때 test1 이라는 함수로 선언한 내용을 같이 출력해달라고 하는 코드입니다. 위에 설명 드린 것처럼 test_child 함수 앞에 '@test1'가 선언이 된 것을 확인 하실 수 있습니다. 아래 코드를 실행을 하면 아래 순서로 실행이 됩니다. 

 

순서 1 - print("TEST - first line")
순서 2 -  def_function() - test_child 함수가 실행 
순서 3 - print("TEST - last line")
순서 4 - def_function() - test_child 함수가 실행

 

# 데코레이터를 선언하기 위한 함수
def test1(def_function):
    def wrapper():
        print("TEST - first line")
        #함수가 실행되는 차례
        def_function()
        print("TEST - last line")
        #함수가 실행되는 차례
        def_function()

    return wrapper

# test1 데코레이터를 선언
@test1
def test_child():
    print("test_child_TEST1")
    print("test_child_TEST2")

#함수를 실행
hello()

 

출력 후 결과는 아래와 같이 출력되는 걸 확인 하실 수 있습니다.

 

함수-데코레이터-결과값
함수-데코레이터

 

클래스 데코레이터

 : 이번에는 클래스 데코레이터를 설명 드리겠습니다. 함수 데코레이터가 함수로 데코레이터를 만들었다면 클래스 데코레이터는 클래스로 만들었다고 생각하시면 됩니다. 하지만 함수 데코레이터와 다르게, 클래스 데코레이터는 자신을 지칭하는 __init__선언을 해주셔야 되고, 그 다음에 __call__ 이라는 함수를 선언해서 데코레이터가 실행했을때 실행되는 구문을 넣어주시면 됩니다. 아래 예제를 통해서 설명 드리겠습니다. 아래 코드를 실행하면 아래와 같은 순서로 진행이 됩니다.

순서 1 - print('클래스 타입 데코레이터')
순서 2 - print(self.function(*args, **kwargs)) - test_decorator() 실행
순서 3 - print('클래스 타입 데코레이터') 


 

class Decorator:

    def __init__(self, function):
        self.function = function

    def __call__(self, *args, **kwargs):
         print('클래스 타입 데코레이터')
         print(self.function(*args, **kwargs))
         print('클래스 타입 데코레이터')

@Decorator
def test_decorator():
    return '클래스 타입 데코레이터 입힌 함수'

test_decorator()

 

 출력 후 결과는 아래와 같이 출력되는 걸 확인 하실 수 있습니다.

 

클래스-데코레이터-결과값
클래스-데코레이터

 



이상입니다 지금까지 데코레이터(decorator)에 대한 내용으로 포스팅을 작성하였습니다. 어떤 형식으로 쓰시든 각 형식에 맞게만 사용하고 그 형식에 추가되는 포인트는 기억해주셔야 합니다. 그럼 위 코드 가지고 응용해보세요~ 이만 마무리 하겠습니다. 감사합니다.

제 Posting이 조금이나마 정보 전달에 도움이 되셨길 빌며, 되셨다면, 구독, 댓글, 공감 3종 세트 부탁 드립니다. 감사합니다.

[저작권이나, 권리를 침해한 사항이 있으면 언제든지 Comment 부탁 드립니다. 검토 후 수정 및 삭제 조치 하도록 하겠습니다. 그리고, 기재되는 내용은 개인적으로 습득한 내용이므로, 혹 오류가 발생할 수 있을 가능성이 있으므로, 기재된 내용은 참조용으로만 봐주시길 바랍니다. 게시물에, 오류가 있을때도, Comment 달아 주시면, 검증 결과를 통해, 수정하도록 하겠습니다.]

728x90

댓글


// 내부링크를 현재창으로 열기 // Open internal links in same tab