파이썬의 매직 메소드는 무엇이며 어떻게 사용하는가

Python의 잘 알려지지 않았지만 유용한 기능 중 하나는 객체에 매직 메서드를 구현하는 기능입니다. 매직 메서드를 사용하면 직관적이고 이해하기 쉬운 깔끔한 코드를 작성할 수 있습니다.

매직 메서드를 사용하면 더 파이썬처럼 느껴지는 방식으로 개체와 상호 작용하기 위한 인터페이스를 만들 수 있습니다. 이 기사에서는 매직 메소드를 소개하고 이를 생성하기 위한 모범 사례에 대해 논의하며 접하게 될 일반적인 매직 메소드를 탐색합니다.

매직 메소드란 무엇입니까?

매직 메서드는 일반적인 작업이 수행될 때 Python 개체의 동작 방식을 정의하는 Python 메서드입니다. 이러한 메서드는 메서드 이름 앞뒤에 이중 밑줄로 명확하게 정의됩니다.

결과적으로 이중 밑줄에서와 같이 일반적으로 dunder 방법이라고 합니다. 이미 접했을 수도 있는 일반적인 던더 메서드는 클래스 생성자를 정의하는 데 사용되는 __init__() 메서드입니다.

일반적으로 dunder 메서드는 코드에서 직접 호출하기 위한 것이 아닙니다. 오히려 프로그램이 실행될 때 인터프리터에 의해 호출됩니다.

매직 메서드가 유용한 이유는 무엇입니까?

매직 메서드는 Python의 객체 지향 프로그래밍에서 유용한 개념입니다. 이를 사용하여 일반적인 기본 제공 작업과 함께 사용될 때 사용자 정의 데이터 유형의 동작을 지정합니다. 이러한 작업에는 다음이 포함됩니다.

🟢 산술 연산

🟢 비교 연산

🟢 라이프 사이클 운영

🟢 표현 작업

다음 섹션에서는 위의 모든 범주에서 사용될 때 애플리케이션이 동작하는 방식을 정의하는 매직 메서드를 구현하는 방법에 대해 설명합니다.

매직 메서드를 정의하는 방법

앞에서 언급했듯이 매직 메서드는 개체의 동작을 지정합니다. 따라서 객체 클래스의 일부로 정의됩니다. 객체 클래스의 일부이기 때문에 객체 자체에 대한 참조인 self를 첫 번째 인수로 받아들입니다.

  Outlook 365에서 삭제된 초안을 복구하는 방법

인터프리터가 호출하는 방식에 따라 추가 인수를 받을 수 있습니다. 또한 이름 앞뒤에 두 개의 밑줄로 명확하게 정의됩니다.

구현

지금까지 우리가 논의한 내용의 대부분은 이론적이고 추상적으로 보입니다. 이 섹션에서는 간단한 Rectangle 클래스를 구현합니다.

이 클래스에는 길이 및 너비 속성이 있습니다. __init__ 메서드를 사용하여 인스턴스화 시 이러한 속성을 지정할 수 있습니다. 또한 ==, < 및 > 연산자를 사용하여 서로 다른 사각형을 비교하여 다른 사각형보다 같은지, 작은지 또는 큰지 확인할 수 있습니다. 마지막으로 사각형은 의미 있는 문자열 표현을 제공할 수 있어야 합니다.

코딩 환경 설정

이 연습을 수행하려면 Python 런타임 환경이 필요합니다. 로컬을 사용하거나 온라인 koreantech.org Python 컴파일러를 사용할 수 있습니다.

Rectangle 클래스 만들기

먼저 Rectangle 클래스를 정의하는 것으로 시작하겠습니다.

class Rectangle:
    pass

생성자 메서드 만들기

다음으로 첫 번째 매직 메서드인 클래스 생성자 메서드를 만들어 보겠습니다. 이 메서드는 높이와 너비를 가져와 클래스 인스턴스에 속성으로 저장합니다.

class Rectangle:
    def __init__(self, height, width):
        self.height = height
        self.width = width

문자열 표현을 위한 매직 메소드 생성

다음으로 우리는 클래스가 개체를 나타내는 사람이 읽을 수 있는 문자열을 생성할 수 있도록 하는 메서드를 만들고 싶습니다. 이 메서드는 Rectangle 클래스의 인스턴스를 인수로 전달하는 str() 함수를 호출할 때마다 호출됩니다. 이 메서드는 인쇄 함수와 같이 문자열 인수가 필요한 함수를 호출할 때도 호출됩니다.

class Rectangle:
    def __init__(self, height, width):
        self.height = height
        self.width = width

    def __str__(self):
        return f'Rectangle({self.height}, {self.width})'

__str__() 메서드는 객체를 나타내려는 문자열을 반환해야 합니다. 이 경우 Rectangle(, ) 형식의 문자열을 반환합니다. 여기서 높이와 너비는 사각형의 저장된 치수입니다.

비교 작업을 위한 매직 메서드 만들기

다음으로 같음, 보다 작음 및 보다 큼 연산에 대한 비교 연산자를 생성하려고 합니다. 이를 연산자 오버로딩이라고 합니다. 이를 생성하기 위해 매직 메서드 __eq__, __lt__ 및 __gt__를 각각 사용합니다. 이 메서드는 사각형 영역을 비교한 후 부울 값을 반환합니다.

class Rectangle:
    def __init__(self, height, width):
        self.height = height
        self.width = width

    def __str__(self):
        return f'Rectangle({self.height}, {self.width})'

    def __eq__(self, other):
        """ Checking for equality """
        return self.height * self.width == other.height * other.width

    def __lt__(self, other):
        """ Checking if the rectangle is less than the other one """
        return self.height * self.width < other.height * other.width

    def __gt__(self, other):
        """ Checking if the rectage is greater than the other one """
        return self.height * self.width > other.height * other.width

보시다시피 이 메서드는 두 개의 매개변수를 사용합니다. 첫 번째는 현재 사각형이고 두 번째는 비교 중인 다른 값입니다. 이 값은 다른 Rectangle 인스턴스 또는 다른 값일 수 있습니다. 비교 논리와 비교가 true를 반환하는 조건은 전적으로 사용자에게 달려 있습니다.

  Readsy Web App으로 빠르게 읽기 속도를 마스터하세요

일반적인 매직 방법

다음 섹션에서는 접하고 사용할 일반적인 마법 방법에 대해 설명합니다.

#1. 산술 연산

산술 매직 메서드는 클래스의 인스턴스가 산술 부호의 왼쪽에 배치될 때 호출됩니다. 메서드는 두 개의 인수로 호출되며 첫 번째 인수는 인스턴스에 대한 참조입니다. 두 번째 값은 기호 오른쪽에 있는 개체입니다. 방법과 표시는 다음과 같습니다.

NameMethodSignDescriptionAddition__add__+추가를 구현합니다. Subtraction__sub__–뺄셈을 구현합니다.Multiplication__mul__*곱셈을 구현합니다Division__div__/나눗셈을 구현합니다.Floor division__floordiv__//바닥 나눗셈을 구현합니다.

#2. 비교 연산

산술 매직 메서드와 마찬가지로 이러한 메서드는 정의된 클래스의 인스턴스가 비교 연산자의 왼쪽에 배치될 때 호출됩니다. 또한 산술 매직 메소드와 같이 두 개의 매개변수로 호출됩니다. 첫 번째는 개체의 인스턴스에 대한 참조입니다. 두 번째는 기호 오른쪽에 있는 값에 대한 참조입니다.

NameMethodSignDescriptionLess than__lt__<보다 작음 비교 구현Greater than__gt__>보다 큼 비교 구현Equal to__eq__==같음 비교 구현작거나 같음__le__>=작거나 같음 비교 구현크거나 같음 to__ge__<=크거나 같음 구현 비교

#삼. 수명 주기 작업

이러한 메서드는 인스턴스화 또는 삭제와 같은 객체의 다양한 수명 주기 메서드에 대한 응답으로 호출됩니다. 생성자 __init__이 이 범주에 속합니다. 이 범주의 일반적인 방법은 아래 표에 나열되어 있습니다.

NameMethodDescriptionConstructor__init__이 메서드는 정의된 클래스의 객체가 삭제될 때마다 호출됩니다. 열려 있는 파일을 닫는 것과 같은 정리 작업을 수행하는 데 사용할 수 있습니다. 삭제__del__이 메서드는 정의된 클래스의 객체가 삭제될 때마다 호출됩니다. 열려 있던 파일을 닫는 것과 같은 정리 작업을 수행하는 데 사용할 수 있습니다. New__new__지정된 클래스의 개체가 인스턴스화될 때 __new__ 메서드가 먼저 호출됩니다. 이 메서드는 생성자보다 먼저 호출되며 클래스와 추가 인수를 받습니다. 클래스의 인스턴스를 반환합니다. 대부분의 경우 그다지 유용하지는 않지만 여기에서 자세히 다룹니다.

#4. 표현 작업

NameMethodDescriptionStr__str__객체의 사람이 읽을 수 있는 문자열 표현을 반환합니다. 이 메서드는 클래스의 인스턴스를 인수로 전달하여 str() 함수를 호출할 때 호출됩니다. 인스턴스를 print() 및 format() 함수에 전달할 때도 호출됩니다. 응용 프로그램의 최종 사용자가 이해할 수 있는 문자열을 제공하기 위한 것입니다.Repr__repr__개발자가 사용하는 개체의 문자열 표현을 반환합니다. 이상적으로 반환된 문자열은 문자열만으로 개체의 동일한 인스턴스를 구성할 수 있도록 정보가 풍부해야 합니다.

  Robinhood에서 손절매를 설정하는 방법

매직 메서드 생성을 위한 모범 사례

매직 메서드는 놀랍고 코드를 단순화합니다. 다만, 사용 시에는 다음 사항에 유의하는 것이 중요합니다.

  • 드물게 사용 – 클래스에 매직 메서드를 너무 많이 구현하면 코드를 이해하기 어렵습니다. 꼭 필요한 것만 구현하도록 제한하십시오.
  • __setatrr__ 및 __getattr__과 같은 메서드를 사용하기 전에 성능에 미치는 영향을 이해해야 합니다.
  • 다른 개발자가 수행하는 작업을 정확히 알 수 있도록 매직 메서드의 동작을 문서화합니다. 이렇게 하면 필요할 때 더 쉽게 사용하고 디버그할 수 있습니다.

마지막 말

이 기사에서는 내장 오퍼레이션과 함께 사용할 수 있는 클래스를 만드는 방법으로 매직 메소드를 소개했습니다. 또한 정의 방법에 대해 설명하고 매직 메서드가 구현된 클래스의 예를 살펴보았습니다. 다음으로 염두에 두어야 할 몇 가지 모범 사례를 공유하기 전에 사용할 가능성이 높고 필요한 다양한 방법에 대해 언급했습니다.

다음으로 Python에서 Counter 클래스를 구현하는 방법을 배우고 싶을 수 있습니다.