데코레이터(@)가 뭐야?

minsing-jin·2023년 12월 24일
0

결론

함수를 말그대로 장식하는것으로 우리가 수학에서 배운 합성함수의 개념을 생각하면 되겠다.
지리는 설명1
지리는 설명2

데코레이터는 기존 함수를 수정하지 않으면서 추가기능을 구현할때 쓴다

데코레이터 = trace함수
기존함수 = hello, world함수

def trace(func):                             # 호출할 함수를 매개변수로 받음
    def wrapper():                           # 호출할 함수를 감싸는 함수
        print(func.__name__, '함수 시작')    # __name__으로 함수 이름 출력
        func()                               # 매개변수로 받은 함수를 호출
        print(func.__name__, '함수 끝')
    return wrapper                           # wrapper 함수 반환
 
def hello():
    print('hello')
 
def world():
    print('world')
 
trace_hello = trace(hello)    # 데코레이터에 호출할 함수를 넣음
trace_hello()                 # 반환된 함수를 호출
trace_world = trace(world)    # 데코레이터에 호출할 함수를 넣음
trace_world()           

@를 쓰는 경우

def trace(func):                             # 호출할 함수를 매개변수로 받음
    def wrapper():
        print(func.__name__, '함수 시작')    # __name__으로 함수 이름 출력
        func()                               # 매개변수로 받은 함수를 호출
        print(func.__name__, '함수 끝')
    return wrapper                           # wrapper 함수 반환
 
@trace    # @데코레이터
def hello():
    print('hello')
 
@trace    # @데코레이터
def world():
    print('world')
 
hello()    # 함수를 그대로 호출
world()    # 함수를 그대로 호출

원리

데코레이터는 함수를 감싸는 형태로 되어있다.

참고-> 데코레이터를 여러개 지정할수도 있다.

@데코레이터1
@데코레이터2
def 함수이름():
    코드

참고문헌
https://dojang.io/mod/page/view.php?id=2427

profile
why not? 정신으로 맨땅에 헤딩하고 있는 코린이

0개의 댓글