본문 바로가기
  • hello world
Language/Python

[Python] 데코레이터(decorator) · 래퍼함수 · 일급객체 · 클로저(closure)

by JJoajjoa 2023. 8. 23.

 

 

데코레이터

코드를 수정하지 않고 함수, 메서드 동작을 변경하거나 확장하고 싶을 때 사용

( ≒ 오버라이딩)

일반적으로 함수를 다른 함수에 매개변수로 전달하는 것처럼 구현된다

 

 

 

데코레이터 함수와 래퍼 함수

래퍼: 변수들 객체로 바꿔주는거

데코레이터 함수를 생성한다

매개변수로 다른 함수를 받는다

데코레이터 함수 내부에 래퍼함수를 만든다

래퍼 함수가 함수의 동작을 변경, 확장 해 줄 수 있다

def log_decorator(func):
    def wrapper(*args, **kwargs):
        print(func.__name__, "함수 실행 전")
        result = func(*args, **kwargs)
        print(func.__name__, "함수 실행 후")
        return result
    return wrapper

@log_decorator
def function():
    print("데코레이터 함수 실행")

function()
# 결과:
# function 함수 실행 전
# 데코레이터 함수 실행
# function 함수 실행 후

 

 

 

일급객체

일급객체의 조건 :

변수에 저장 할 수 있다

인수(매개변수)로 전달 할 수 있다

반환값(return)으로 사용할 수 있다

자료구조 내부에 넣을 수 있다

 

파이썬에서는 함수가 일급객체이다

함수에 변수를 할당할 수 있고 인수를 전달하고 반환할 수 있다

그래서 런타임동안 처리 가능, 자료구조에 추가도 가능

 

 

 

 

클로저 Closure

함수 내부에서 정의된 함수에서 외부 함수의 변수를 참조하거나 변경을 하고

외부함수가 종료된 후에도 해당 사용했던 변수값을 유지할 수 있게 해주는 함수

( ≒ 래퍼함수) 

def outer(x):
    def inner(y):
        return x+y
    return inner

a = outer(5)
result = a(3)
print(result) #8