Python 데코레이터 기본

PythonBeginner
지금 연습하기

소개

Python 의 데코레이터는 함수, 클래스 또는 메서드의 동작을 수정하거나 향상시킬 수 있도록 해줍니다. 이는 소스 코드를 변경하지 않고도 코딩의 기능을 동적으로 변경하는 방법입니다. 이 랩에서는 데코레이터의 기본 사항과 데코레이터를 사용하여 코드에 기능을 추가하는 방법을 살펴보겠습니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 91%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

데코레이터 이해

간단한 예시부터 시작해 보겠습니다. 새로운 Python 인터프리터 세션을 엽니다.

python3

숫자의 제곱을 계산하는 함수가 있습니다.

def square(x):
    return x**2

이제 square 함수에 함수가 호출될 때마다 함수의 입력과 출력을 기록하는 기능을 추가하고 싶다고 가정해 보겠습니다. 데코레이터를 사용하여 이를 수행할 수 있습니다.

다음은 logger 데코레이터의 코드입니다.

def logger(func):
    def wrapper(x):
        print("Calling function:", func.__name__)
        print("Input:", x)
        result = func(x)
        print("Output:", result)
        return result
    return wrapper

이제 이 데코레이터를 사용하여 square 함수를 향상시킬 수 있습니다.

@logger
def square(x):
    return x**2

square(5)를 호출하면 출력은 다음과 같습니다.

Calling function: square
Input: 5
Output: 25

보시다시피 데코레이터는 소스 코드를 변경하지 않고도 square 함수에 원하는 기능을 추가했습니다.

매개변수를 사용하는 데코레이터

데코레이터는 매개변수도 받을 수 있습니다. 예를 들어, logger 데코레이터를 수정하여 입력 및 출력 로그 전에 인쇄할 메시지를 받도록 할 수 있습니다.

def logger(message):
    def decorator(func):
        def wrapper(x):
            print(message)
            print("Calling function:", func.__name__)
            print("Input:", x)
            result = func(x)
            print("Output:", result)
            return result
        return wrapper
    return decorator

이제 이 업데이트된 데코레이터를 사용하여 square 함수를 향상시킬 수 있습니다.

@logger("This is a custom message")
def square(x):
    return x**2

square(5)를 호출하면 출력은 다음과 같습니다.

This is a custom message
Calling function: square
Input: 5
Output: 25

여러 데코레이터 사용

여러 수준의 기능을 추가하기 위해 여러 데코레이터를 서로 쌓을 수도 있습니다. 예를 들어, 함수가 실행되는 데 걸리는 시간을 측정하는 timer라는 새로운 데코레이터를 만들어 보겠습니다.

import time

def timer(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print("Time elapsed:", end_time - start_time)
        return result
    return wrapper

이제 square 함수에 loggertimer 데코레이터를 모두 사용해 보겠습니다.

@logger("This is a custom message")
@timer
def square(x):
    return x**2

square(5)를 호출하면 출력은 다음과 같습니다.

This is a custom message
Calling function: square
Input: 5
Output: 25
Time elapsed: 0.000001

보시다시피 timer 데코레이터는 square 함수에 경과 시간 정보를 추가했고, logger 데코레이터는 입력 및 출력 로그와 사용자 지정 메시지를 추가했습니다.

요약

이 랩에서는 Python 의 데코레이터 기본 사항을 배웠습니다. 데코레이터를 사용하여 함수, 클래스 또는 메서드의 동작을 수정하는 방법과 여러 데코레이터를 사용하여 여러 수준의 기능을 추가하는 방법을 살펴보았습니다. 또한 사용자 지정 기능을 추가하기 위해 매개변수가 있는 데코레이터를 사용하는 방법도 살펴보았습니다.

이러한 기술을 통해 이제 데코레이터를 코드에 통합하여 개발자로서의 삶을 더 쉽게 만들 수 있습니다!