[Python] Decorator

hyunsooo·2023년 10월 17일
0

Python의 데코레이터는 함수에서 코드를 바꾸지 않고 수정 및 추가를 하고 싶을 때 활용할 수 있는 문법입니다. 또한 코드의 중복을 줄일 수 있는 방법으로도 사용할 수 있습니다.

def hello():
	print('hello 시작')
    print('hello')
    print('hello 끝')
    
def world():
	print('world 시작')
    print('world')
	print('world 시작')

예를 들어, 위처럼 함수의 시작과 끝을 알리고 싶다면 모든 함수에 print을 활용하여 시작과 끝의 정보를 코딩해야 합니다. 이런 상황에서 데코레이터를 통해 코드의 중복을 줄여줄 수 있습니다.

def trace(func):
    def wrapper():
        print(func.__name__, '시작')
        func()
        print(func.__name__, '끝')
    return wrapper


def hello():
    print('hello')
    
def world():
    print('world')
    
trace_hello = trace(hello)
trace_hello()
trace_world = trace(world)
trace_world()     

데코레이터는 호출할 함수를 매겨변수로 받습니다. 그 안에는 호출할 함수를 감싸는 wrapper를 만들어 사용할 수 있습니다. 이때 wrapper의 이름은 자유롭게 사용해도 상관없습니다. wrapper함수에는 함수의 시작과 끝을 알리는 기능을 추가와 trace에서 매개변수로 받은 func을 호출하도록 할 수 있습니다. 즉, trace라는 외부 함수의 매개변수를 wrapper가 참조함으로 외부 함수가 종료된 후에도 내부 함수가 외부 함수의 변수를 참조할 수 있도록 저장하는 클로저(Closure)입니다.

def trace(func):
    def wrapper():
        print(func.__name__, '시작')
        func()
        print(func.__name__, '끝')
    return wrapper

@trace
def hello():
    print('hello')

@trace
def world():
    print('world')
    
hello()
world() 

파이썬에서는 @문법을 사용하여 간편하게 데코레이터를 사용할 수 있습니다.

profile
지식 공유

0개의 댓글