본문 바로가기

프로그래밍 언어/파이썬

파이썬(Python) 데코레이터, 함수 장식과 재사용성 증가

파이썬(Python) 데코레이터, 함수 장식과 재사용성 증가

파이썬 데코레이터는 함수의 기능을 수정하거나 확장할 때 유용하게 사용되는 고급 기능입니다. 데코레이터를 사용하면 코드의 재사용성을 높이고, 함수의 동작을 쉽게 변경할 수 있습니다. 이 글에서는 데코레이터의 기본 개념부터 실제 사용 예제까지 다루어 보겠습니다.

 

 

 

1. 데코레이터란 무엇인가?

데코레이터는 함수를 감싸는 함수로, 기존 함수에 추가적인 기능을 부여하거나 수정할 수 있는 기능입니다. 데코레이터를 사용하면 코드의 반복을 줄이고, 더 깨끗하고 관리하기 쉬운 코드를 작성할 수 있습니다.

 

 

2. 데코레이터의 기본 구조

데코레이터는 다른 함수를 인수로 받아서, 감싸는 함수 안에서 해당 함수를 호출하는 방식으로 동작합니다. 다음은 데코레이터의 기본 구조입니다:


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()
            

위의 예제에서 my_decoratorsay_hello 함수를 감싸고, 함수 호출 전후에 추가적인 출력을 합니다.

 

 

3. 함수 데코레이터

함수 데코레이터는 주로 함수의 전처리와 후처리를 담당합니다. 예를 들어, 함수의 실행 시간을 측정하거나, 함수의 인자를 검증하는 등의 작업을 수행할 수 있습니다.


import time

def timer_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"Execution time: {end_time - start_time} seconds")
        return result
    return wrapper

@timer_decorator
def slow_function():
    time.sleep(2)
    print("Function complete.")

slow_function()
            

이 예제에서는 timer_decoratorslow_function의 실행 시간을 측정합니다.

 

 

4. 클래스 데코레이터

클래스 데코레이터는 함수뿐만 아니라 클래스에도 적용할 수 있습니다. 이를 통해 클래스의 메서드나 속성을 수정하거나 확장할 수 있습니다.


def class_decorator(cls):
    class NewClass(cls):
        def new_method(self):
            return "This is a new method"
    return NewClass

@class_decorator
class MyClass:
    def original_method(self):
        return "This is the original method"

my_instance = MyClass()
print(my_instance.original_method())
print(my_instance.new_method())
            

위의 예제에서 class_decoratorMyClass에 새로운 메서드를 추가합니다.

 

 

 

 

5. 실전 예제

다음은 실전에서 유용하게 사용할 수 있는 데코레이터 예제입니다. 이 데코레이터는 함수 호출 시 로그를 남깁니다:


def log_decorator(func):
    def wrapper(*args, **kwargs):
        print(f"Calling function {func.__name__} with arguments {args} and {kwargs}")
        result = func(*args, **kwargs)
        print(f"Function {func.__name__} returned {result}")
        return result
    return wrapper

@log_decorator
def add(a, b):
    return a + b

add(2, 3)
            

이 데코레이터는 add 함수의 호출 시점과 결과를 로그로 출력합니다.

 

 

6. 결론

데코레이터는 파이썬에서 코드의 재사용성을 높이고, 기능을 확장하는 데 매우 유용한 도구입니다. 함수를 감싸는 형태로 동작하며, 다양한 방식으로 활용할 수 있습니다. 이 가이드를 통해 데코레이터를 이해하고, 실전에서 활용해 보세요.