>  기사  >  백엔드 개발  >  Python 데코레이터: 기능 향상에 대한 더 많은 이해

Python 데코레이터: 기능 향상에 대한 더 많은 이해

Linda Hamilton
Linda Hamilton원래의
2024-11-19 22:09:02967검색

Python Decorators: More Understanding into Functionality Enhancement

기본을 넘어 데코레이터를 깊이 있게 이해해 봅시다. 데코레이터는 단순히 "추가 레이어"에 관한 것이 아니라 기능에 동적으로 기능을 추가하여 적응력이 뛰어나고 강력하게 만드는 정교한 방법을 제공합니다.


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

본질적으로 데코레이터는 다른 함수를 인수로 받아들이고 기능을 추가하며 새 함수를 반환하는 고차 함수입니다. 이를 통해 원래 기능을 변경하지 않고 그대로 두고 추가 기능으로 원래 기능을 "장식"할 수 있습니다.

구문 요약:

@decorator_name
def my_function():
    pass

my_function 앞에 @ decorator_name을 사용하는 것은 다음을 의미하는 약어입니다.

my_function = decorator_name(my_function)

2. 기본 데코레이터 만들기

함수 호출 시 로그를 기록하는 간단한 데코레이터를 만들어 보겠습니다.

def log_call(func):
    def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__}")
        return func(*args, **kwargs)
    return wrapper

@log_call
def greet(name):
    print(f"Hello, {name}!")

greet("Alice")  # Outputs: Calling greet, then Hello, Alice!
  • log_call은 Greeting을 감싸는 데코레이터입니다.
  • *args 및 `kwargs`**는 위치 또는 키워드 인수 수에 관계없이 작동하는지 확인합니다.

3. 실제 사용 사례

데코레이터는 일반적으로 다음 용도로 사용됩니다.

  • 액세스 제어: 예: 사용자 권한 확인
  • 캐싱: 비용이 많이 드는 함수 호출의 결과를 저장합니다.
  • 재시도 메커니즘: 실패 시 자동으로 기능을 재시도합니다.
  • 입력 유효성 검사: 함수가 실행되기 전에 인수를 확인합니다.

4. 인수가 있는 데코레이터

데코레이터에 추가 매개변수가 필요한 경우도 있습니다. 이 경우 데코레이터에 매개변수를 전달하는 외부 함수를 추가합니다.

:

def repeat(times):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for _ in range(times):
                func(*args, **kwargs)
        return wrapper
    return decorator

@repeat(3)
def say_hello():
    print("Hello!")

say_hello()  # Outputs "Hello!" three times

여기서,peat는 times 인수를 기반으로 데코레이터를 생성하는 데코레이터 팩토리입니다.


5. 스태킹 데코레이터

단일 함수에 여러 데코레이터를 쌓아 강력한 동작 체인을 만들 수 있습니다.

:

def make_bold(func):
    def wrapper():
        return "<b>" + func() + "</b>"
    return wrapper

def make_italic(func):
    def wrapper():
        return "<i>" + func() + "</i>"
    return wrapper

@make_bold
@make_italic
def greet():
    return "Hello!"

print(greet())  # Outputs: <b><i>Hello!</i></b>

@make_bold와 @make_italic을 겹쳐서 볼드체와 이탤릭체 태그로 인사합니다.


6. functools.wraps를 사용하여 메타데이터 보존

함수를 꾸밀 때 원래 함수의 메타데이터(예: 이름 및 독스트링)를 보존하고 싶은 경우가 많습니다. functools.wraps를 사용하여 래퍼가 이러한 세부 정보를 덮어쓰지 않도록 하세요.

from functools import wraps

def log_call(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__}")
        return func(*args, **kwargs)
    return wrapper

@wraps(func)는 func의 이름과 문서 문자열이 유지되도록 보장합니다.


7. 수업의 데코레이터

데코레이터는 단지 독립형 기능만을 위한 것이 아닙니다. 클래스 메소드와 함께 사용할 수도 있습니다.

:

@decorator_name
def my_function():
    pass

require_auth 데코레이터는 access_dashboard 메소드에 대한 액세스를 허용하기 전에 사용자가 인증되었는지 확인합니다.


결론: 데코레이터로 코드 강화

데코레이터는 Python의 매우 중요한 부분으로, 유연하고 재사용 가능한 방식으로 함수 동작을 향상, 수정 및 제어할 수 있습니다. 코드를 더욱 표현력 있고 모듈화하며 우아하게 만듭니다. 데코레이터를 사용하면 단순히 기능을 추가하는 것이 아니라 코드베이스를 개선하고 풍부하게 할 수 있습니다.

위 내용은 Python 데코레이터: 기능 향상에 대한 더 많은 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.