본문 바로가기
[Language] - Python

# 18. 데코레이터 (Decorator)

by Bebsae 2021. 11. 9.

이번 포스트는 갑자기 프로퍼티 포스트에 급 어그로가 끌려서 데코레이터가 무엇이냐고 묻는 분들을 위해 간략하게 작성한다. 데코레이터의 사전적인 의미는 장식자이다. 무엇을 장식할까? 바로 함수를 장식한다.

 

데코레이터 사용법은 대상이 되는 함수 위에 @데코레이터명 을 쓰면 된다. 예를 들면, @staticmethod, @classmethod, @property 등 다양한 데코레이터들이 있고, 사용자가 임의로 데코레이터를 정의할 수도 있다.

 

데코레이터가 무엇인지 코드로 직접 이해해보자.

def say_hi():
    print("i'm function")
    print('hi')


def say_hello():
    print("i'm function")
    print('hello')


def say_bye():
    print("i'm function")
    print('bye')

예를 들어, 위와 같은 함수 3개가 있다고 가정해보자. 위 함수들은 중복된 코드가 존재한다. 그것은 i'm funciton 이라는 문자열을 출력하는 부분이다. 지금은 중복되는 코드가 한줄밖에 안되니까 감흥이 안올수도 있지만, 만약 중복되는 코드가 100줄을 넘어간다고 극단적으로 생각해보자. 우리는 컨트롤 C, V의 도사가 되어 있을 것이다. 이에 따라 코드는 점점 길어지고 지저분해질 것이다. 그래서 우리는 데코레이터를 사용하여 중복을 최소화 하고 이해하기 쉽게 바꿀 수 있다.

 

# 데코레이터 함수 정의
def example_deco(func):
    def new_func(*args, **kwargs):
        print("i'm function")
        func()
    # (함수의 리턴값이 아닌) 함수를 리턴
    return new_func


# 대상 함수 : say_hello_2, 데코레이터 : example_deco
@example_deco
def say_hello_2():
    print('hello')


# 대상 함수 : say_hi_2, 데코레이터 : example_deco
@example_deco
def say_hi_2():
    print('hi')


# 대상 함수 : say_bye_2, 데코레이터 : example_deco
@example_deco
def say_bye_2():
    print('bye')

우선 데코레이터 함수를 정의해야 한다. example_deco 라는 함수는 func 라는 것을 인자로 받는다. 이 func는 우리가 데코레이터로 감쌀 대상이 되는 함수 자체를 의미한다.

 

example_deco 안에는 내부 함수를 하나 더 정의한 후, 그 안에서 우리가 반복적으로 동작할 코드를 작성한 뒤, 인자로 받은 func를 여기서 실행한다! 그리고 이 내부 함수를 리턴해주면 끝!

 

그다음에 우리는 데코레이터로 감쌀 함수 위에 @데코레이터명만 적어주면 끝이다. 실행 결과는 다음과 같다.

say_hello_2()
say_hi_2()
say_bye_2()

>>
i'm function
hello
i'm function
hi
i'm function
bye

 

'[Language] - Python' 카테고리의 다른 글

# 20. Counter  (0) 2022.03.01
# 19. [Magic Method] __call__()  (0) 2021.11.19
# 17. [Magic Method] __new__() & __init__()  (0) 2021.08.02
# 16. eval  (0) 2021.08.02
# 15. [Tip] chunk  (0) 2021.06.02

댓글