파이썬 클래스 평등

Aditya Raj 2023년6월21일
  1. Python에서 클래스 개체의 동등성
  2. __eq__() 메서드를 사용한 파이썬 클래스 동등성
  3. id() 메서드를 사용한 파이썬 클래스 동등성
파이썬 클래스 평등

Python에서는 비교 연산자를 사용하여 다양한 데이터 유형을 비교할 수 있습니다. 그러나 사용자 정의 클래스를 만들 때 비교 연산자를 사용하여 단순히 비교할 수는 없습니다.

이 기사에서는 Python에서 사용자 정의 클래스를 사용하여 정의된 객체의 동등성을 확인하는 다양한 방법에 대해 설명합니다.

Python에서 클래스 개체의 동등성

정수나 문자열과 같은 내장 객체가 있는 경우 아래와 같이 == 연산자를 사용하여 이들의 동등성을 쉽게 확인할 수 있습니다.

num1 = 12
num2 = 10
result = num1 == num2
print("{} and {} are equal:{}".format(num1, num2, result))

출력:

12 and 10 are equal:False

여기서 == 연산자는 값 12와 10이 정수이기 때문에 올바른 값을 출력으로 제공합니다. 그러나 사용자 지정 클래스의 개체가 있는 경우 Python 인터프리터는 다르게 작동합니다.

예를 들어, 아래와 같이 length라는 하나의 속성만 있는 Length 클래스가 있다고 가정합니다.

class Length:
    def __init__(self, value):
        self.length = value

length 속성에 동일한 값을 사용하여 Length 클래스의 두 인스턴스를 생성합니다.

class Length:
    def __init__(self, value):
        self.length = value


len1 = Length(10)
len2 = Length(10)

== 연산자를 사용하여 객체를 비교하면 두 인스턴스의 length 속성 값이 동일하더라도 결과는 False가 됩니다. 다음 코드에서 이를 관찰할 수 있습니다.

class Length:
    def __init__(self, value):
        self.length = value


len1 = Length(10)
len2 = Length(10)
result = len1 == len2
print("len1 and len2 are equal:", result)

출력:

len1 and len2 are equal: False

Python 인터프리터의 위 동작은 사용자 정의 클래스의 두 개체를 비교하는 방식을 사용하여 설명할 수 있습니다. == 연산자를 사용하여 Python에서 두 클래스 개체의 동등성을 확인할 때 두 개체가 동일한 메모리 위치를 참조하는 경우에만 결과가 True가 됩니다.

즉, 두 개의 변수가 있지만 단일 Python 객체만 있습니다. 다음 예제에서 이를 관찰할 수 있습니다.

class Length:
    def __init__(self, value):
        self.length = value


len1 = Length(10)
len2 = len1
result = len1 == len2
print("len1 and len2 are equal:", result)

출력:

len1 and len2 are equal: True

두 변수가 사용자 정의 클래스의 동일한 인스턴스를 참조하는 경우에만 등호 연산자가 True를 반환한다는 것을 이해했을 것입니다.

Python에서 클래스의 다른 인스턴스의 동등성을 확인해야 하는 경우 어떻게 해야 합니까? 알아봅시다.

__eq__() 메서드를 사용한 파이썬 클래스 동등성

__eq__() 메서드를 재정의하여 == 연산자가 사용자 정의 클래스와 함께 작동하는 방식을 수정할 수 있습니다. 예를 들어 Length 클래스의 두 인스턴스 길이를 확인하기 위해 __eq__() 메서드를 재정의할 수 있습니다.

__eq__() 메서드 내에서 아래에서 설명하는 단계를 사용합니다.

  1. __eq__() 메서드는 Length 클래스의 인스턴스에서 호출될 때 다른 객체를 입력 인수로 사용합니다.

  2. __eq__() 메서드 내에서 먼저 입력 개체가 Length 클래스의 인스턴스인지 여부를 확인합니다. 이를 위해 isinstance() 함수를 사용할 수 있습니다.

  3. isinstance() 함수는 Python 객체를 첫 번째 입력 인수로 사용하고 클래스 이름을 두 번째 입력 인수로 사용합니다. 실행 후 개체가 입력 인수에 제공된 클래스의 인스턴스인 경우 True를 반환합니다.

  4. 프로그램의 두 번째 입력 인수로 Length 클래스를 전달합니다. 첫 번째 인수에 전달된 개체가 Length 클래스의 인스턴스가 아닌 경우 False를 반환합니다.

    그렇지 않으면 계속 진행할 것입니다.

  5. 두 개체의 클래스 동등성을 확인하기 위해 두 개체의 속성 길이 값을 비교합니다. 값이 같으면 True를 반환합니다.

    그렇지 않으면 False를 반환합니다.

__eq__() 메서드가 Length 클래스에서 구현되면 == 연산자를 사용하여 Number 클래스의 두 인스턴스를 올바르게 비교할 수 있습니다.

Length 클래스에 len1len2라는 두 개의 인스턴스가 있다고 가정합니다. len1==len2를 수행하면 len1.__eq__(len2) 메서드가 실행됩니다.

마찬가지로 len2==len1을 수행하면 len2.__eq__(len1) 메서드가 실행됩니다.

코드를 실행한 후 len1==len2는 두 객체의 길이 값이 동일한 경우 True를 반환합니다. 그렇지 않으면 False를 반환합니다.

다음 예제에서 이를 관찰할 수 있습니다.

class Length:
    def __init__(self, value):
        self.length = value

    def __eq__(self, other):
        isLength = isinstance(other, self.__class__)
        if not isLength:
            return False
        if self.length == other.length:
            return True
        else:
            return False


len1 = Length(10)
len2 = Length(10)
result = len1 == len2
print("len1 and len2 are equal:", result)

출력:

len1 and len2 are equal: True

id() 메서드를 사용한 파이썬 클래스 동등성

사용자 정의 클래스의 객체를 가진 두 변수가 동일한 객체를 참조하는지 여부도 확인할 수 있습니다. 이를 위해 id() 함수를 사용할 수 있습니다.

id() 함수는 개체를 입력 인수로 사용하고 메모리 위치에서 고유한 식별 번호를 반환합니다. 다음 예제에서 이를 관찰할 수 있습니다.

class Length:
    def __init__(self, value):
        self.length = value

    def __eq__(self, other):
        isLength = isinstance(other, self.__class__)
        if not isLength:
            return False
        if self.length == other.length:
            return True
        else:
            return False


len1 = Length(10)
len2 = Length(10)
result1 = id(len1)
result2 = id(len2)
print("ID of len1 is ", result1)
print("ID of len2 is ", result2)

출력:

ID of len1 is  140057455513712
ID of len2 is  140057454483488

두 개체가 동일한 메모리 위치를 참조하는 경우 id() 함수는 두 개체에 대해 동일한 출력을 제공합니다. id() 함수의 출력을 비교하여 개체가 동일한 메모리 위치를 참조하는지 여부를 확인할 수 있습니다.

다음 예제에서 이를 관찰할 수 있습니다.

class Length:
    def __init__(self, value):
        self.length = value

    def __eq__(self, other):
        isLength = isinstance(other, self.__class__)
        if not isLength:
            return False
        if self.length == other.length:
            return True
        else:
            return False


len1 = Length(10)
len2 = Length(10)
result1 = id(len1)
result2 = id(len2)
result = result1 == result2
print("len1 and len2 are equal:", result)

출력:

len1 and len2 are equal: False

여기에서 클래스 동등성을 확인하기 위해 객체의 속성 값을 확인하지 않았음을 알 수 있습니다.

이 경우 객체가 동일한 메모리 위치를 참조하는지 여부만 확인합니다. 따라서 Python 클래스 동등성을 검사하는 이 접근 방식은 클래스 정의에서 __eq__() 메서드를 구현하지 않고 == 연산자를 사용하는 것과 같습니다.

작가: Aditya Raj
Aditya Raj avatar Aditya Raj avatar

Aditya Raj is a highly skilled technical professional with a background in IT and business, holding an Integrated B.Tech (IT) and MBA (IT) from the Indian Institute of Information Technology Allahabad. With a solid foundation in data analytics, programming languages (C, Java, Python), and software environments, Aditya has excelled in various roles. He has significant experience as a Technical Content Writer for Python on multiple platforms and has interned in data analytics at Apollo Clinics. His projects demonstrate a keen interest in cutting-edge technology and problem-solving, showcasing his proficiency in areas like data mining and software development. Aditya's achievements include securing a top position in a project demonstration competition and gaining certifications in Python, SQL, and digital marketing fundamentals.

GitHub

관련 문장 - Python Class