제퍼넷 로고

우아한 코드를 작성하기 위한 8가지 내장 Python 데코레이터 – KDnuggets

시간

우아한 코드를 작성하기 위한 8가지 내장 Python 데코레이터
편집자별 이미지
 

깔끔하고 읽기 쉬운 구문을 갖춘 Python은 널리 사용되는 고급 프로그래밍 언어입니다. Python은 단순성과 프로그램 유지 관리 비용 절감을 강조하는 사용 편의성을 위해 설계되었습니다. 개발자가 처음부터 코드를 작성할 필요성을 줄이고 개발자의 생산성을 높이는 광범위한 라이브러리가 함께 제공됩니다. 코드 우아함에 기여하는 Python의 강력한 기능 중 하나는 데코레이터입니다.

Python에서 데코레이터는 핵심 논리를 변경하지 않고 다른 함수의 동작을 수정할 수 있는 함수입니다. 다른 함수를 인수로 사용하고 확장된 기능을 가진 함수를 반환합니다. 이렇게 하면 데코레이터를 사용하여 기존 함수에 몇 가지 추가 논리를 추가하여 단 ​​몇 줄의 코드만으로 재사용성을 높일 수 있습니다. 이 기사에서는 보다 우아하고 유지 관리하기 쉬운 코드를 작성하는 데 도움이 되는 8가지 내장 Python 데코레이터를 살펴보겠습니다.

 

우아한 코드를 작성하기 위한 8가지 내장 Python 데코레이터
편집자별 이미지

XNUMXD덴탈의 @atexit.register 데코레이터는 프로그램 종료 시 실행될 함수를 등록하는 데 사용됩니다. 이 함수는 정상적인 실행 때문이든 예상치 못한 오류로 인해 프로그램이 종료되려고 할 때 모든 작업을 수행하는 데 사용할 수 있습니다.

예:

import atexit

# Register the exit_handler function
@atexit.register
def exit_handler():
    print("Exiting the program. Cleanup tasks can be performed here.")

# Rest of the program
def main():
    print("Inside the main function.")
    # Your program logic goes here.

if __name__ == "__main__":
    main()

출력:

Inside the main function.
Exiting the program. Cleanup tasks can be performed here.

 

위의 구현에서, @atexit.register 함수 정의 위에 언급되어 있습니다. 이는 다음을 정의합니다. exit_handler() 종료 기능으로 작동합니다. 본질적으로 이는 정상적인 실행을 통해 또는 조기 종료를 유발하는 예상치 못한 오류로 인해 프로그램이 종료 지점에 도달할 때마다 exit_handler() 함수가 호출됩니다.

XNUMXD덴탈의 @dataclasses.dataclass "__init__", "__repr__" 등과 같은 클래스에 대한 일반적인 특수 메서드를 자동으로 생성하는 데 사용되는 강력한 데코레이터입니다. 클래스 인스턴스를 초기화하고 비교하기 위해 상용구 메서드를 작성할 필요가 없으므로 더 깔끔하고 간결한 코드를 작성하는 데 도움이 됩니다. 또한 일반적인 특수 메서드가 코드베이스 전체에서 일관되게 구현되도록 보장하여 오류를 방지하는 데 도움이 될 수 있습니다.

예:

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int


point = Point(x=3, y=2)
# Printing object
print(point)

# Checking for the equality of two objects
point1 = Point(x=1, y=2)
point2 = Point(x=1, y=2)
print(point1 == point2)

출력:

Point(x=3, y=2)
True

 

XNUMXD덴탈의 @dataclass Point 클래스 정의 위에 적용된 데코레이터는 Python에 특수 메서드 생성을 위해 기본 동작을 활용하도록 신호를 보냅니다. 이렇게 하면 자동으로 __init__ 객체 인스턴스화 시 x, y와 같은 클래스 속성을 초기화하는 메서드입니다. 결과적으로 명시적인 코딩 없이도 포인트와 같은 인스턴스를 구성할 수 있습니다. 더욱이, __repr__ 객체의 문자열 표현을 제공하는 메서드도 자동으로 조정됩니다. 이렇게 하면 점과 같은 객체가 인쇄될 때 출력 Point(x=3, y=2)에서 볼 수 있듯이 명확하고 순서대로 표현됩니다. 또한 두 인스턴스 point1과 point2 간의 동등 비교(==)는 True를 생성합니다. 이는 기본적으로 Python이 메모리 위치를 기반으로 동등성을 확인하기 때문에 주목할 만합니다. 그러나 데이터 클래스 객체의 맥락에서 동등성은 그 안에 포함된 데이터에 의해 결정됩니다. 이는 @dataclass 데코레이터가 __eq__ 동일한 메모리 위치를 확인하는 대신 객체에 존재하는 데이터의 동일성을 확인하는 방법입니다.

XNUMXD덴탈의 @enum.unique enum 모듈에 있는 데코레이터는 열거형의 모든 멤버 값이 고유한지 확인하는 데 사용됩니다. 이렇게 하면 동일한 값을 가진 여러 열거형 멤버가 실수로 생성되어 혼란과 오류가 발생하는 것을 방지할 수 있습니다. 중복된 값이 발견되면 값 오류 제기됩니다.

예:

from enum import Enum, unique

@unique
class VehicleType(Enum):
    CAR = 1
    TRUCK = 2
    MOTORCYCLE = 3
    BUS = 4

# Attempting to create an enumeration with a duplicate value will raise a ValueError
try:
    @unique
    class DuplicateVehicleType(Enum):
        CAR = 1
        TRUCK = 2
        MOTORCYCLE = 3
        # BUS and MOTORCYCLE have duplicate values
        BUS = 3
except ValueError as e:
    print(f"Error: {e}")

 

출력:

Error: duplicate values found in : BUS -> MOTORCYCLE

 

위 구현에서 "BUS"와 "MOTORCYCLE"은 "3"이라는 동일한 값을 갖습니다. 그 결과, @unique 데코레이터는 중복된 값이 발견되었음을 나타내는 메시지와 함께 ValueError를 발생시킵니다. 동일한 키를 두 번 이상 사용할 수 없으며 동일한 값을 다른 구성원에게 할당할 수도 없습니다. 이러한 방식으로 여러 열거형 멤버의 값이 중복되는 것을 방지하는 데 도움이 됩니다.

XNUMXD덴탈의 partial 데코레이터는 부분 함수를 만드는 데 사용되는 강력한 도구입니다. 부분 함수를 사용하면 원래 함수의 일부 인수를 미리 설정하고 해당 인수가 이미 채워진 새 함수를 생성할 수 있습니다.

예:

from functools import partial

# Original function
def power(base, exponent):
    return base ** exponent

# Creating a partial function with the exponent fixed to 2
square = partial(power, exponent=2)

# Using the partial function
result = square(3)
print("Output:",result)

 

출력:

 

위의 구현에는 "base"와 "exComponent"라는 두 인수를 받아들이고 밑의 지수 거듭제곱 결과를 반환하는 "power" 함수가 있습니다. 지수가 2로 미리 설정된 원래 함수를 사용하여 "square"라는 부분 함수를 만들었습니다. 이러한 방식으로 다음을 사용하여 원래 함수의 기능을 확장할 수 있습니다. partial 데코레이터.

XNUMXD덴탈의 @singledisptach 데코레이터는 일반 함수를 만드는 데 사용됩니다. 이름은 같지만 인수 유형이 다른 다양한 함수 구현을 정의할 수 있습니다. 이는 코드가 데이터 유형에 따라 다르게 동작하도록 하려는 경우 특히 유용합니다.

예:

from functools import singledispatch

# Decorator
@singledispatch
def display_info(arg):
    print(f"Generic: {arg}")

# Registering specialized implementations for different types
@display_info.register(int)
def display_int(arg):
    print(f"Received an integer: {arg}")

@display_info.register(float)
def display_float(arg):
    print(f"Received a float: {arg}")

@display_info.register(str)
def display_str(arg):
    print(f"Received a string: {arg}")

@display_info.register(list)
def display_sequence(arg):
    print(f"Received a sequence: {arg}")

# Using the generic function with different types
display_info(39)             
display_info(3.19)          
display_info("Hello World!")
display_info([2, 4, 6])     

 

출력:

Received an integer: 39
Received a float: 3.19
Received a string: Hello World!
Received a sequence: [2, 4, 6]

 

위 구현에서 우리는 먼저 일반 함수를 개발했습니다. display_info() 를 사용하여 @singledisptach 데코레이터를 적용한 다음 int, float, string 및 list에 대한 구현을 별도로 등록했습니다. 출력에는 다음 작업이 표시됩니다. display_info() 별도의 데이터 유형에 대해.

XNUMXD덴탈의 @classmethod 클래스 내에서 클래스 메서드를 정의하는 데 사용되는 데코레이터입니다. 클래스 메소드는 클래스의 객체가 아닌 클래스에 바인딩됩니다. 정적 메서드와 클래스 메서드의 주요 차이점은 클래스 상태와의 상호 작용에 있습니다. 클래스 메서드는 클래스 상태에 액세스하고 이를 수정할 수 있지만 정적 메서드는 클래스 상태에 액세스하여 독립적으로 작동할 수 없습니다.

예:

class Student:
    total_students = 0

    def __init__(self, name, age):
        self.name = name
        self.age = age
        Student.total_students += 1

    @classmethod
    def increment_total_students(cls):
        cls.total_students += 1
        print(f"Class method called. Total students now: {cls.total_students}")

# Creating instances of the class
student1 = Student(name="Tom", age=20)
student2 = Student(name="Cruise", age=22)

# Calling the class method
Student.increment_total_students()  #Total students now: 3

# Accessing the class variable
print(f"Total students from student 1: {student1.total_students}")
print(f"Total students from student 2: {student2.total_students}")

 

출력:

Class method called. Total students now: 3
Total students from student 1: 3
Total students from student 2: 3

 

위의 구현에서는 학생 수업은 총_학생 클래스 변수로. 그만큼 @classmethod 데코레이터는 increment_total_students() 증가시키는 클래스 메소드 총_학생 변하기 쉬운. Student 클래스의 인스턴스를 생성할 때마다 총 학생 수는 1씩 증가합니다. 우리는 클래스의 두 인스턴스를 만든 다음 클래스 메서드를 사용하여 총_학생 변수 3, 이는 클래스의 인스턴스에도 반영됩니다.

XNUMXD덴탈의 @staticmethod 데코레이터는 클래스 내에서 정적 메서드를 정의하는 데 사용됩니다. 정적 메서드는 클래스의 인스턴스를 만들지 않고도 호출할 수 있는 메서드입니다. 정적 메서드는 개체 관련 매개 변수에 액세스할 필요가 없고 클래스 전체와 더 관련이 있을 때 자주 사용됩니다.

예:

class MathOperations:
    @staticmethod
    def add(x, y):
        return x + y

    @staticmethod
    def subtract(x, y):
        return x - y

# Using the static methods without creating an instance of the class
sum_result = MathOperations.add(5, 4)
difference_result = MathOperations.subtract(8, 3)

print("Sum:", sum_result)            
print("Difference:", difference_result)

 

출력:

Sum: 9
Difference: 5

 

위의 구현에서 우리는 @staticmethod "MathOperations" 클래스에 대한 정적 메소드 add()를 정의합니다. 클래스 인스턴스를 생성하지 않고 두 개의 숫자 "4"와 "5"를 추가하면 "9"가 됩니다. 마찬가지로 두 숫자 "8"과 "3"을 빼면 "5"가 됩니다. 이런 방식으로 인스턴스 상태가 필요하지 않은 유틸리티 기능을 수행하기 위해 정적 메서드를 생성할 수 있습니다. 

XNUMXD덴탈의 @property 데코레이터는 클래스 속성에 대한 getter 메소드를 정의하는 데 사용됩니다. getter 메서드는 속성 값을 반환하는 메서드입니다. 이러한 메서드는 클래스나 인스턴스의 세부 정보에 액세스할 수 있는 사람을 지정하는 데이터 캡슐화에 사용됩니다.

예:

class Circle:
    def __init__(self, radius):
        self._radius = radius

    @property
    def radius(self):
        # Getter method for the radius.
        return self._radius

    @property
    def area(self):
        # Getter method for the area.
        return 3.14 * self._radius**2

# Creating an instance of the Circle class
my_circle = Circle(radius=5)

# Accessing properties using the @property decorator
print("Radius:", my_circle.radius)          
print("Area:", my_circle.area)  

 

출력:

Radius: 5
Area: 78.5

 

위 구현에서 "Circle" 클래스에는 "radius" 속성이 있습니다. 우리는 사용했습니다 @property 반경과 면적에 대한 getter 메소드를 설정합니다. 클래스 사용자가 이러한 속성에 액세스할 수 있도록 깔끔하고 일관된 인터페이스를 제공합니다. 

이 기사에서는 코드를 더욱 유연하고 읽기 쉽게 만드는 데 사용할 수 있는 가장 다재다능하고 기능적인 데코레이터 중 일부를 강조합니다. 이러한 데코레이터를 사용하면 원래 함수의 기능을 확장하여 더 체계적으로 만들고 오류 발생 가능성을 줄일 수 있습니다. 이는 Python 프로그램을 깔끔하게 보이고 원활하게 작동하게 만드는 마법의 손길과 같습니다.
 
 

칸월 메린 데이터 과학 및 의료 분야의 AI 응용에 큰 관심을 가진 소프트웨어 개발자 지망생입니다. Kanwal은 APAC 지역의 Google Generation Scholar 2022로 선정되었습니다. Kanwal은 유행하는 주제에 대한 기사를 작성하여 기술 지식을 공유하는 것을 좋아하며 기술 산업에서 여성의 대표성을 개선하는 데 열정적입니다.

spot_img

최신 인텔리전스

spot_img