찾다
백엔드 개발파이썬 튜토리얼더욱 깨끗하고 효율적인 코드를 위한 필수 Python 데코레이터 패턴

ssential Python Decorator Patterns for Cleaner, More Efficient Code

베스트셀러 작가로서 Amazon에서 제 책을 탐색해 보시기 바랍니다. Medium에서 저를 팔로우하고 지지를 표시하는 것을 잊지 마세요. 감사합니다! 당신의 지원은 세상을 의미합니다!

Python 데코레이터는 핵심 로직을 변경하지 않고도 함수와 클래스를 수정하거나 향상시킬 수 있는 강력한 기능입니다. 개발자로서 저는 데코레이터 패턴을 마스터하는 것이 코드 품질, 재사용성 및 유지 관리성을 크게 향상시킬 수 있다는 것을 발견했습니다. 내 프로젝트에 특히 유용하다고 생각하는 7가지 필수 데코레이터 패턴을 살펴보겠습니다.

클래스 데코레이터

클래스 데코레이터는 클래스 동작과 속성을 수정하거나 향상시키는 방법을 제공합니다. 클래스 정의 바로 위에 있는 @designator 구문을 사용하여 적용됩니다. 저는 메소드를 추가하거나, 기존 메소드를 수정하거나, 클래스 속성을 변경하기 위해 클래스 데코레이터를 자주 사용했습니다.

다음은 클래스에 새 메소드를 추가하는 클래스 데코레이터의 예입니다.

def add_greeting(cls):
    def say_hello(self):
        return f"Hello, I'm {self.name}"
    cls.say_hello = say_hello
    return cls

@add_greeting
class Person:
    def __init__(self, name):
        self.name = name

person = Person("Alice")
print(person.say_hello())  # Output: Hello, I'm Alice

이 예에서 add_greeting 데코레이터는 Person 클래스에 say_hello 메소드를 추가합니다. 이 패턴은 소스 코드를 수정하지 않고 여러 클래스에 걸쳐 기능을 확장하려는 경우 특히 유용합니다.

인수를 포함하는 함수 데코레이터

인수를 허용하는 함수 데코레이터는 훨씬 더 많은 유연성을 제공합니다. 이를 통해 데코레이터 자체의 동작을 사용자 정의할 수 있습니다. 다양한 사용 사례에 맞게 미세 조정할 수 있는 재사용 가능한 데코레이터를 만들 때 이 패턴이 매우 중요하다는 것을 알았습니다.

다음은 지정된 횟수만큼 함수 호출을 반복할 수 있는 데코레이터의 예입니다.

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

@repeat(times=3)
def greet(name):
    print(f"Hello, {name}!")

greet("Bob")
# Output:
# Hello, Bob!
# Hello, Bob!
# Hello, Bob!

이 예에서 반복 데코레이터는 데코레이팅된 함수를 호출해야 하는 횟수를 결정하는 times 인수를 사용합니다. 이 패턴을 사용하면 함수에 데코레이터를 적용하는 방법에 큰 유연성이 제공됩니다.

함수 메타데이터 보존

데코레이터를 사용할 때는 원래 함수의 메타데이터를 보존하는 것이 중요합니다. 여기에는 함수 이름, 독스트링 및 기타 속성이 포함됩니다. Python 표준 라이브러리의 functools.wraps 데코레이터는 이를 달성하는 데 도움이 됩니다.

예:

from functools import wraps

def my_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        """This is the wrapper function"""
        print("Something is happening before the function is called.")
        result = func(*args, **kwargs)
        print("Something is happening after the function is called.")
        return result
    return wrapper

@my_decorator
def say_hello(name):
    """This function greets someone"""
    print(f"Hello, {name}!")

say_hello("Charlie")
print(say_hello.__name__)  # Output: say_hello
print(say_hello.__doc__)   # Output: This function greets someone

@wraps(func)를 사용하여 래퍼 함수가 원래 함수의 메타데이터를 사용하도록 보장합니다. 이는 디버깅 및 자체 검사에 매우 중요합니다.

여러 데코레이터 쌓기

데코레이터를 쌓아서 단일 기능에 여러 데코레이터를 적용할 수 있습니다. 데코레이터는 아래에서 위로 적용되므로 장식 순서가 중요합니다.

예:

def decorator1(func):
    def wrapper(*args, **kwargs):
        print("Decorator 1")
        return func(*args, **kwargs)
    return wrapper

def decorator2(func):
    def wrapper(*args, **kwargs):
        print("Decorator 2")
        return func(*args, **kwargs)
    return wrapper

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

greet("David")
# Output:
# Decorator 1
# Decorator 2
# Hello, David!

이 예에서는 decorator2가 먼저 적용된 다음 decorator1이 적용됩니다. 여러 데코레이터를 사용하여 작업할 때는 실행 순서를 이해하는 것이 중요합니다.

메모이제이션 데코레이터

메모이제이션은 비용이 많이 드는 함수 호출의 결과를 저장하고 동일한 입력이 다시 발생할 때 캐시된 결과를 반환하는 최적화 기술입니다. 저는 메모이제이션 데코레이터가 재귀 함수나 값비싼 계산이 필요한 함수의 성능을 향상시키는 데 매우 유용하다는 것을 알았습니다.

다음은 메모 장식 데코레이터의 예입니다.

def add_greeting(cls):
    def say_hello(self):
        return f"Hello, I'm {self.name}"
    cls.say_hello = say_hello
    return cls

@add_greeting
class Person:
    def __init__(self, name):
        self.name = name

person = Person("Alice")
print(person.say_hello())  # Output: Hello, I'm Alice

이 메모이제이션 데코레이터는 피보나치 함수의 결과를 캐시하여 대규모 입력에 대한 성능을 획기적으로 향상시킵니다.

타이밍 및 로깅 데코레이터

타이밍 함수 실행 및 로깅 함수 호출을 위한 데코레이터는 성능 분석 및 디버깅에 매우 유용합니다. 저는 개발 과정에서 이러한 기능을 자주 사용합니다.

다음은 타이밍과 로깅 데코레이터를 결합한 예입니다.

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

@repeat(times=3)
def greet(name):
    print(f"Hello, {name}!")

greet("Bob")
# Output:
# Hello, Bob!
# Hello, Bob!
# Hello, Bob!

이 데코레이터는 함수가 호출되는 시점과 실행하는 데 걸리는 시간을 기록합니다. 이는 내 코드의 성능 병목 현상을 식별하는 데 매우 유용한 패턴입니다.

컨텍스트 관리자 데코레이터

컨텍스트 관리자는 일반적으로 리소스 관리 및 오류 처리를 위해 with 문과 함께 사용됩니다. 기능을 컨텍스트 관리자로 바꾸는 데코레이터를 만들어 우아한 설정 및 해제 작업을 가능하게 할 수 있습니다.

예:

from functools import wraps

def my_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        """This is the wrapper function"""
        print("Something is happening before the function is called.")
        result = func(*args, **kwargs)
        print("Something is happening after the function is called.")
        return result
    return wrapper

@my_decorator
def say_hello(name):
    """This function greets someone"""
    print(f"Hello, {name}!")

say_hello("Charlie")
print(say_hello.__name__)  # Output: say_hello
print(say_hello.__doc__)   # Output: This function greets someone

이 예에서 file_manager 데코레이터는 예외가 발생하더라도 작업 후 파일이 제대로 닫히도록 보장합니다.

데코레이터 생성 및 사용 모범 사례

데코레이터와 작업하면서 도움이 되는 몇 가지 모범 사례를 배웠습니다.

  1. 함수 메타데이터를 보존하려면 functools.wraps를 사용하세요.
  2. 데코레이터를 단순하게 유지하고 단일 책임에 집중하세요.
  3. 데코레이터에 인수를 전달해야 하는 경우 데코레이터 팩토리를 사용하세요.
  4. 특히 자주 호출되는 함수의 경우 데코레이터가 성능에 미치는 영향에 유의하세요.
  5. 데코레이터가 수행하는 작업과 발생할 수 있는 부작용을 설명하여 명확하게 문서화하세요.
  6. 디버깅할 때 데코레이터가 간접 계층을 추가한다는 점을 기억하세요. Python 디버거의 @ 구문과 같은 도구는 데코레이팅된 함수를 한 단계씩 실행하는 데 도움이 될 수 있습니다.

장식된 코드를 테스트하는 것은 때때로 까다로울 수 있습니다. 내가 자주 사용하는 접근 방식 중 하나는 데코레이팅된 기능과 별도로 데코레이터를 테스트하는 것입니다. 이를 통해 더욱 세부적인 테스트와 디버깅이 쉬워집니다.

다음은 데코레이터를 테스트하는 방법의 예입니다.

def decorator1(func):
    def wrapper(*args, **kwargs):
        print("Decorator 1")
        return func(*args, **kwargs)
    return wrapper

def decorator2(func):
    def wrapper(*args, **kwargs):
        print("Decorator 2")
        return func(*args, **kwargs)
    return wrapper

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

greet("David")
# Output:
# Decorator 1
# Decorator 2
# Hello, David!

이 테스트에서는 모의 함수를 사용하여 데코레이터가 원래 함수를 올바르게 호출하고 그 결과를 반환하는지 확인합니다.

데코레이터는 Python의 강력한 도구이며 이러한 패턴을 익히면 코딩 능력이 크게 향상될 수 있습니다. 이를 통해 문제를 명확하게 분리하고, 코드 재사용을 촉진하며, 코드를 더 읽기 쉽고 유지 관리하기 쉽게 만들 수 있습니다.

데코레이터를 효과적으로 사용하는 열쇠는 간단하게 시작하고 필요에 따라 점차적으로 복잡성을 구축하는 것임을 알았습니다. 기본 기능 데코레이터로 시작한 다음 클래스 데코레이터 및 데코레이터 팩토리와 같은 고급 패턴으로 넘어갑니다.

데코레이터는 코드를 크게 향상시킬 수 있지만 신중하게 사용해야 한다는 점을 기억하세요. 데코레이터를 과도하게 사용하면 코드를 이해하고 디버그하기 어려울 수 있습니다. 데코레이터가 특정 사용 사례에 가장 적합한 솔루션인지 항상 고려하세요.

데코레이터와 계속 작업하면서 새로운 패턴과 사용 사례를 발견하게 될 것입니다. Python 커뮤니티는 끊임없이 혁신하고 있으며 새로운 데코레이터 기술이 정기적으로 등장합니다. 호기심을 갖고, 다양한 접근 방식을 실험하고, 주저하지 말고 자신만의 데코레이터 패턴을 만들어 프로젝트의 고유한 문제를 해결하세요.

데코레이터는 더 깔끔하고 효율적인 코드를 작성하는 데 도움이 되는 Python의 많은 강력한 기능 중 하나일 뿐입니다. 데코레이터에 익숙해지면 생성기, 컨텍스트 관리자, 메타클래스와 같은 다른 Python 기능과 잘 통합되어 우아하고 강력한 코드 디자인을 위한 더 많은 가능성을 열어준다는 사실을 알게 될 것입니다.


101권

101 Books는 작가 Aarav Joshi가 공동 창립한 AI 기반 출판사입니다. 고급 AI 기술을 활용하여 출판 비용을 믿을 수 없을 정도로 낮게 유지합니다. 일부 도서의 가격은 $4만큼 저렴하여 모든 사람이 양질의 지식에 접근할 수 있습니다.

아마존에서 구할 수 있는 Golang Clean Code 책을 확인해 보세요.

업데이트와 흥미로운 소식을 계속 지켜봐 주시기 바랍니다. 책을 쇼핑할 때 Aarav Joshi를 검색해 더 많은 책을 찾아보세요. 제공된 링크를 이용하여 특별할인을 즐겨보세요!

우리의 창조물

저희 창작물을 꼭 확인해 보세요.

인베스터 센트럴 | 투자자 중앙 스페인어 | 중앙 독일 투자자 | 스마트리빙 | 시대와 메아리 | 수수께끼의 미스터리 | 힌두트바 | 엘리트 개발자 | JS 학교


우리는 중간에 있습니다

테크 코알라 인사이트 | Epochs & Echoes World | 투자자중앙매체 | 수수께끼 미스터리 매체 | 과학과 신기원 매체 | 현대 힌두트바

위 내용은 더욱 깨끗하고 효율적인 코드를 위한 필수 Python 데코레이터 패턴의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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

이 튜토리얼은 Python을 사용하여 Zipf의 법칙의 통계 개념을 처리하는 방법을 보여주고 법을 처리 할 때 Python의 읽기 및 대형 텍스트 파일을 정렬하는 효율성을 보여줍니다. ZIPF 분포라는 용어가 무엇을 의미하는지 궁금 할 것입니다. 이 용어를 이해하려면 먼저 Zipf의 법칙을 정의해야합니다. 걱정하지 마세요. 지침을 단순화하려고 노력할 것입니다. Zipf의 법칙 Zipf의 법칙은 단순히 : 큰 자연어 코퍼스에서 가장 자주 발생하는 단어는 두 번째 빈번한 단어, 세 번째 빈번한 단어보다 세 번, 네 번째 빈번한 단어 등 4 배나 자주 발생합니다. 예를 살펴 보겠습니다. 미국 영어로 브라운 코퍼스를 보면 가장 빈번한 단어는 "TH입니다.

파이썬에서 파일을 다운로드하는 방법파이썬에서 파일을 다운로드하는 방법Mar 01, 2025 am 10:03 AM

Python은 인터넷에서 파일을 다운로드하는 다양한 방법을 제공하며 Urllib 패키지 또는 요청 도서관을 사용하여 HTTP를 통해 다운로드 할 수 있습니다. 이 튜토리얼은 이러한 라이브러리를 사용하여 Python의 URL에서 파일을 다운로드하는 방법을 설명합니다. 도서관을 요청합니다 요청은 Python에서 가장 인기있는 라이브러리 중 하나입니다. URL에 쿼리 문자열을 수동으로 추가하지 않고 HTTP/1.1 요청을 보낼 수 있습니다. 요청 라이브러리는 다음을 포함하여 많은 기능을 수행 할 수 있습니다. 양식 데이터 추가 다중 부문 파일을 추가하십시오 파이썬 응답 데이터에 액세스하십시오 요청하십시오 머리

HTML을 구문 분석하기 위해 아름다운 수프를 어떻게 사용합니까?HTML을 구문 분석하기 위해 아름다운 수프를 어떻게 사용합니까?Mar 10, 2025 pm 06:54 PM

이 기사에서는 HTML을 구문 분석하기 위해 파이썬 라이브러리 인 아름다운 수프를 사용하는 방법을 설명합니다. 데이터 추출, 다양한 HTML 구조 및 오류 처리 및 대안 (SEL과 같은 Find (), find_all (), select () 및 get_text ()와 같은 일반적인 방법을 자세히 설명합니다.

파이썬의 이미지 필터링파이썬의 이미지 필터링Mar 03, 2025 am 09:44 AM

시끄러운 이미지를 다루는 것은 특히 휴대폰 또는 저해상도 카메라 사진에서 일반적인 문제입니다. 이 튜토리얼은 OpenCV를 사용 하여이 문제를 해결하기 위해 Python의 이미지 필터링 기술을 탐구합니다. 이미지 필터링 : 강력한 도구 이미지 필터

Python을 사용하여 PDF 문서를 사용하는 방법Python을 사용하여 PDF 문서를 사용하는 방법Mar 02, 2025 am 09:54 AM

PDF 파일은 운영 체제, 읽기 장치 및 소프트웨어 전체에서 일관된 콘텐츠 및 레이아웃과 함께 크로스 플랫폼 호환성에 인기가 있습니다. 그러나 Python Processing Plain Text 파일과 달리 PDF 파일은 더 복잡한 구조를 가진 이진 파일이며 글꼴, 색상 및 이미지와 같은 요소를 포함합니다. 다행히도 Python의 외부 모듈로 PDF 파일을 처리하는 것은 어렵지 않습니다. 이 기사는 PYPDF2 모듈을 사용하여 PDF 파일을 열고 페이지를 인쇄하고 텍스트를 추출하는 방법을 보여줍니다. PDF 파일의 생성 및 편집에 대해서는 저의 다른 튜토리얼을 참조하십시오. 준비 핵심은 외부 모듈 PYPDF2를 사용하는 데 있습니다. 먼저 PIP를 사용하여 설치하십시오. PIP는 p입니다

Django 응용 프로그램에서 Redis를 사용하여 캐시하는 방법Django 응용 프로그램에서 Redis를 사용하여 캐시하는 방법Mar 02, 2025 am 10:10 AM

이 튜토리얼은 Redis 캐싱을 활용하여 특히 Django 프레임 워크 내에서 Python 응용 프로그램의 성능을 향상시키는 방법을 보여줍니다. 우리는 Redis 설치, Django 구성 및 성능 비교를 다루어 Bene을 강조합니다.

NLTK (Natural Language Toolkit) 소개NLTK (Natural Language Toolkit) 소개Mar 01, 2025 am 10:05 AM

NLP (Natural Language Processing)는 인간 언어의 자동 또는 반자동 처리입니다. NLP는 언어학과 밀접한 관련이 있으며인지 과학, 심리학, 생리학 및 수학에 대한 연구와 관련이 있습니다. 컴퓨터 과학에서

Tensorflow 또는 Pytorch로 딥 러닝을 수행하는 방법은 무엇입니까?Tensorflow 또는 Pytorch로 딥 러닝을 수행하는 방법은 무엇입니까?Mar 10, 2025 pm 06:52 PM

이 기사는 딥 러닝을 위해 텐서 플로와 Pytorch를 비교합니다. 데이터 준비, 모델 구축, 교육, 평가 및 배포와 관련된 단계에 대해 자세히 설명합니다. 프레임 워크, 특히 계산 포도와 관련하여 주요 차이점

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는