될때까지

((Python)) 데코레이터 끝내버리겠다. 본문

프로젝트/wecode

((Python)) 데코레이터 끝내버리겠다.

랖니 2022. 6. 24. 20:57
728x90

데코레이터란? 

하나의 함수를 매개변수로 받아 다른 함수를 반환하는 함수를 말한다. 여러개의 함수가 연속적으로 자동 호출되게 하고 싶을 때 데코레이터를 사용한다. 함수를 매개변수로 사용할 수 있는 이유는 함수도 객체이기 때문!!

1. def welcome_decorator(func):
2.    def inner_method():
3.        return func() + "welcome to WECODE!"
4.    return inner_method   # welcome_decorator함수는 inner_method함수를 반환하고 있는거지 호출이 아니다.
5.
6. @welcome_decorator
7. def greeting():
8.   return "Hello, "
9.
10. print(greeting())

greeting함수의 호출이 10번줄에서 일어났다. 

print(greeting())

그럼 함수를 실행하자. 해당 greeting함수는 6번에서 보면 데코레이터 표시와 함께 붙어있다.

데코레이터가 붙은 함수 greeting이 호출이 되면 파이썬이 아래와 같이 변환해서 호출을 한다.

decorated_function = welcome_decorator(greeting)
decorated_function()

매개변수로 greeting 함수를 갖고 있는 welcome_decorator 함수의 호출 결과(즉 반!환!값!)가 decorated_function에 담긴다.

(왜냐 괄호로 호출을 하고 나서 변수에 담았으니까 실행 결과가 담긴다!! )

welcome_decorator(greeting)의 반환값은 return inner_method이니까 inner_method 함수 자체가 decorated_function에 담긴다.

(왜냐 () 괄호를 안붙였으니까 함수가 실행이 안되고 그냥 함수 자체를 객체로 전달한다!! )

decorated_function() => 괄호를 붙여서 함수의 호출이 일어났으므로 이때 실행을 한다.

def inner_method():
    return greeting() + "welcome to WECODE!"

inner_method()는 greeting()함수를 호출하니까 greeting()함수가 실행되고

def greeting():
    return "Hello, "

"Hello, "를 반환한다!!! 함수의 호출이 끝났으니까 아까 그 코드로 돌아가게 되고

def inner_method():
    return greeting() + "welcome to WECODE!"

greeting()은 "Hello, "가 된다. 그 뒤에 "welcome to WECODE!"가 붙어서

 

최종 결과값으로 "Hello, wecolme to WECODE!"가 찍힌다

 

이해하는데 이틀이 걸렸다니 내시간.. 여러 멘토분들께 여쭤봤지만 아!! 하고 스쳐지나간 건 같은 동기분의 설명 ㅠㅠㅠㅠㅠㅠ 잘왔다 위코드 데코레이터 그렇게 넘어갑니다.!

멘토님이 전달주신 사이트 영어라서 읽다가 우선 포기했지만.. 나중에 헷갈리는 개념이 생기면 또 찾아봐야하니까 슬쩍 남겨두기

https://realpython.com/primer-on-python-decorators/#simple-decorators

728x90