Decorator

LEE_JUN_HA·2021년 3월 7일
0

데코레이터란?

• 어떤 함수를 받아 명령을 추가한 뒤 이를 다시 함수의 형태로 반환하는 함수
• 어떤 함수의 내부를 수정하지 않고 기능에 변화를 주고 싶을 때 사용한다
• 말그대로 다른 함수를 꾸며주는 함수

데코레이터의 구조

def 데코레이터이름(func):  # 기능을 추가할 함수를 인자로 받아온다.
    def 내부함수이름(*args, **kwargs):
        기존 함수에 추가할 명령
        return func(*args, **kwargs)
    return 내부함수이름

클로저와 매우 흡사하게 생겼다는 것을 알 수 있다. 차이점이라면 데코레이터는 다른 함수를 인자로 받는다는 점이다.

def decorator(func):                        # 1
    def wrapper(*args, **kwargs):           # 4
        print('Hello')                      # 7
        return func(*args, **kwargs)        # 8
    return wrapper                          # 5


def introduce(name):                        # 2
    print(f'My name is {name}!')            # 9


decorated_introduce = decorator(introduce)  # 3
decorated_introduce('JunHa')              # 6

• #1 : decorator 라는 함수가 정의되었다.
• #2 : introduce 라는 함수가 정의되었다.
• #3 : decorator 함수에 introduce 함수를 인자로 전달하여 호출하였다. 그 출력값을 decorated_introduce 라는 변수에 할당하기로 한다.
• #4 : decorator 함수가 호출되어 내부 명령이 실행된다. wrapper 라는 함수가 정의되었다.
• #5 : wrapper 함수가 호출되지 않은 함수 자체의 상태로 리턴되었다. 따라서 아직 wrapper 함수 내의 명령들은 실행되지 않는다.
• #6 : decorated_introduce 변수에는 decorator 함수의 리턴값 즉, 호출되지 않은 wrapper 함수가 할당된다.
따라서 decorated_introduce('JunHa') 는 wrapper('JunHa') 과 같아진다.
실제로 아래와 같이 확인해보면 decorated_introduce 함수에는 decorator 함수의 로컬 스콥에 있는 wrapper 함수가 할당되어 있는 것을 볼 수 있다.

오늘의 집 클론에서 쓴 데코레이터

profile
할 수 있다, 할 수 있다, 아자뵤!

0개의 댓글