TIL #25 Python-decorator

강경훈·2020년 8월 22일
0
post-thumbnail
post-custom-banner

decorator 함수는 특정 함수를 실행하기 전에 강제적으로 다른 함수가 먼저 실행된후 실행되도록 하는 강제성을 제공하는 기능입니다.

예를 들어 유료회원에게만 주는 정보가 있을 때, 누군가 정보를 달라는 호출을 하면 유료회원인지를 확인하는 함수가 먼저 실행되고 정보를 보여주는 함수가 호출 되는 것입니다.

1. Nested function

  • 함수 안에서 다시 함수를 선언
  • 함수(부모 함수) 안에서 선언된 자식 함수는 부모 함수 안에서만 호출 가능
  • 사용 이유
    - 가독성
    - closure 기능 사용
  • 예)
def parent_function():
    def child_function():
        print("this is a child function")
    child_function()

parent_function()
> "this is a child function"

2. closure

  • 자식 함수가 부모 함수의 변수나 정보를 중첩 함수 내에서 사용한다.
  • 부모 함수는 리턴값으로 자식 함수를 리턴한다.
  • 부모 함수의 변수를 외부로부터의 직접적인 접근을 격리 한다.
  • 격리된 부모 함수의 변수는 자식 함수에서 사용 가능하다.
  • decorator의 기본 구조

3. decorator - 사용법

  • decorator 함수 코드
def trace(func):
    def wrapper(*args):
        print("실행되는 함수 이름:", func.__name__)
        print("args: ", args)
        result = func(*args)
        print("함수 호출 결과: ", result)
        return result
    return wrapper
@ trace #decorator
def add(a,b):
    return a + b
@trace #decorator
def multiply(a, b):
    return a * b

deco_result = add(3,5)
print(deco_result)

> 출력
실행되는 함수 이름: add
args:  (3, 5)
함수 호출 결과:  8
8
실행되는 함수 이름: multiply
args:  (3, 5)
함수 호출 결과:  15
15
  • decorator 함수 생성
    1) 함수를 매개변수로 받는 trace라는 decorator 생성
    2) 자식 함수인 wrapper을 return
    3) wrapper는 trace가 매개변수로 받은 함수의 결과 값을 return
    4) 즉, 매개변수로 받은 함수의 결과가 return 되기전 wrapper가 실행 됨
    5) add 함수와 multiply 함수 위에 @trace을 쓰면 해당 함수들이 호출 되었을 때 trace 함수가 실행
  • 실행 코드
    1) add 함수를 호출하고 이를 deco_result에 저장
    2) add 함수가 호출되었기 때문에 trace함수 실행
    3) trace 함수는 add 함수를 매개변수로 받음
    4) trace 함수가 wrapper을 return 하여 wrapper 실행
    5) closure 효과로 trace의 변수 func(=add) 사용 가능
    6) result에 func(=add)의 결과 저장
    7) result를 return하고 함수 종료
    8) muliply도 add와 동일한 과정으로 함수 실행
    9) 단, 이 때는 func = mulitply
profile
방랑하는 개발자
post-custom-banner

0개의 댓글