21.2.19

<파이썬 어려웠던 개념 정리 : 중첩 함수 / 클로저 / 데코레이터 53>

  • 부모 함수에서만 호출할 수 있다.

  • 왜 쓸까? : 가독성, 클로저

  • 클로저? : 폐쇄란 뜻. "중첩 함수가 부모 함수의 변수나 정보를 가두어 사용하는 것을 closure"

    중첩 함수가 부모 함수의 변수나 정보를 중첩 함수 내에서 사용한다.
    부모 함수는 리턴값으로 중첩 함수를 리턴한다.
    부모 함수에서 리턴 했으므로 부모 함수의 변수는 직접적인 접근이 불가능 하지만 부모 함수가 리턴한 중첩 함수를 통해서 사용될 수 있다.

  • 언제쓸까? : 어떠한 정보를 기반으로 연산을 실행하고 싶지만 기반이 되는 정보는 접근을 제한하여 노출이 되거나 수정이 되지 못하게 하고 싶을때

  • 주로 factory를 구현할 때 쓴다 : 뭔가 생성해내는 패턴일 때.

예 : n의 m승 만든는 함수의 함수 만들기.

def generate_power(base_number):
    def nth_power(power):
        return base_number ** power
    return nth_power
 
calculate_power_of_two = generate_power(2)
 
calculate_power_of_two(7)
> 128
 
calculate_power_of_two(10)
> 1024
 
calculate_power_of_seven = generate_power(7)
 
calculate_power_of_seven(3)
> 343
 
calculate_power_of_seven(5)
> 16907
  • 문제 : 데코레이터 구현
    왜 쓰지 ? : if문으로는 불안한 API 구현의 보안 때문에. 함수가 작동하면 써지고 아님 말고가 되어야하니까.
    데코레이터??? : 장식.

  • 해결 : 또 동기분의 도움을 받음. 근데도 어렵다.(감사할 뿐..)

def welcome_decorator(func):
  s_msg = "welcome to WECODE!"
  def wrapper():
   full_msg = func() + s_msg
   return  full_msg
  return wrapper

@welcome_decorator
def greeting():
  return "Hello, "

greeting()
  • (도식 설명데로 하면) 먼저 데코레이터 함수를 먼저 호출한다. @~옆에는 가상의 ()이 붙은 상태고 그 안으로 함수 greeting이 들어간다.
  • 이후 위로 올라간다. 그래서 func를 써준다. 이후 원래 이 함수가 선언해야 할 인삿말을 써준다.
  • 다음으로 wrapper 부분에서 위 함수를 완성시켜준다. 이후 풀 메시지를 리턴해준 뒤 레퍼를 리턴해주면 된다.
  • 도식에 익숙해지자. 일단은 물어봐서 겨우 풀었지만 많은 이해가 필요하다.

좋은 웹페이지 즐겨찾기