본문 바로가기
Programming/Python

Python의 데코레이터

by BTC_박현영 2023. 11. 24.

데코레이터는 Python의 가장 강력한 기능 중 하나로, 메타프로그래밍을 가능하게 합니다. 함수나 메소드의 동작을 변경하거나 확장할 수 있는 데코레이터를 통해 코드의 재사용성과 가독성을 크게 향상시킬 수 있습니다. 본 게시물에서는 Python의 데코레이터에 대한 기본적인 이해와 활용 방법을 알아보겠습니다.

데코레이터란?
데코레이터는 다른 함수를 감싸는 함수로, 감싸진 함수의 동작을 변경하거나 확장할 수 있습니다. 이를 통해 기존 함수의 코드를 수정하지 않고도 새로운 기능을 추가할 수 있습니다. Python의 데코레이터는 기본적으로 함수나 메소드를 인자로 받는 함수입니다. 이 함수는 래핑된 함수에 추가적인 기능을 부여하거나 수정하고, 이를 반환합니다. 데코레이터는 @ 기호를 사용하여 적용됩니다. 이는 해당 함수에 데코레이터를 적용하고, 이 함수의 동작을 데코레이터가 수정한 방식으로 변경합니다.

 

기본적인 데코레이터의 예

def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

say_hello()

 

 

 

데코레이터의 활용
데코레이터는 로깅, 권한 검사, 타이밍 측정 등 다양한 곳에 활용될 수 있습니다.

1. 로깅 데코레이터 예제
로깅 데코레이터는 함수의 호출과 반환 값을 로그로 기록하는 데 사용됩니다. 이는 디버깅과 성능 모니터링에 유용합니다.

import logging

def log_decorator(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        logging.info(f"{func.__name__} returned {result}")
        return result
    return wrapper

@log_decorator
def add(x, y):
    return x + y

add(5, 3)

 

 

2. 권한 검사 데코레이터
권한 검사 데코레이터는 특정 조건이 충족되는 경우에만 함수를 실행시키는 데 사용됩니다. 예를 들어, 사용자가 관리자인지를 확인하는 경우에 활용할 수 있습니다.

def admin_required(func):
    def wrapper(*args, **kwargs):
        if not user.is_admin():
            raise Exception("사용자가 관리자 권한을 가지고 있지 않습니다.")
        return func(*args, **kwargs)
    return wrapper

@admin_required
def delete_user(user_id):
    print(f"{user_id} 사용자 삭제")

 

 

3. 타이밍 측정 데코레이터
타이밍 측정 데코레이터는 함수의 실행 시간을 측정하는 데 사용됩니다. 성능 분석과 최적화에 유용합니다.

예제 코드

import time

def timing_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{func.__name__} 실행 시간: {end_time - start_time}초")
        return result
    return wrapper

@timing_decorator
def long_running_function():
    time.sleep(2)

 


데코레이터는 Python에서 코드를 모듈화하고 효율적으로 재사용하는 데 매우 유용한 도구입니다. 로깅, 권한 검사, 타이밍 측정과 같은 다양한 적용 사례를 통해 코드의 유지 관리를 개선하고, 프로그램의 안정성과 성능을 향상시킬 수 있습니다.

 

 


참고 자료
Python 공식 문서: 데코레이터

'Programming > Python' 카테고리의 다른 글

[Python] pymysql 사용하기  (0) 2023.12.11
Python의 Generators  (1) 2023.12.07
Python의 타입 힌트  (0) 2023.11.10
Python에서의 메모리 관리와 가비지 컬렉션  (0) 2023.10.27
Python에서의 비동기 프로그래밍  (0) 2023.10.12

댓글