>  기사  >  백엔드 개발  >  Python 클래스에서 동등성을 달성하는 방법: __eq__, __ne__ 및 해싱에 대한 심층 분석?

Python 클래스에서 동등성을 달성하는 방법: __eq__, __ne__ 및 해싱에 대한 심층 분석?

Linda Hamilton
Linda Hamilton원래의
2024-11-08 08:12:02363검색

How to Achieve Equivalence in Python Classes: A Deep Dive into __eq__, __ne__, and Hashing?

우아하게 Python 클래스에서 동등성 구현

Python에서 사용자 정의 클래스는 eq 및 특수 메서드 구현을 통해 동등성을 갖출 수 있습니다. == 및 != 연산자는 각각 ne입니다. 이를 통해 해당 클래스의 객체를 해당 속성에 따라 비교할 수 있습니다.

기본 구현

동등성을 달성하는 간단하면서도 효과적인 방법은 객체의 속성이 포함된 사전을 비교하는 것입니다. :

class Foo:
    def __init__(self, item):
        self.item = item

    def __eq__(self, other):
        if isinstance(other, self.__class__):
            return self.__dict__ == other.__dict__
        else:
            return False

    def __ne__(self, other):
        return not self.__eq__(other)

함정 극복

이 방법은 개체 간의 동등성을 설정하는 반면 같은 클래스라도 관련 없는 유형의 하위 클래스나 인스턴스를 처리할 때 문제에 직면합니다. 이러한 문제를 해결하려면 다음 고려 사항이 중요합니다.

클래식 스타일 클래스의 비가환성:

클래식 스타일 Python 2 클래스는 eq를 실행합니다. 첫 번째 피연산자의 메서드이고 두 번째 피연산자는 ne 입니다. 대칭을 보장하려면 지원되지 않는 피연산자 유형에 대해 NotImplemented를 반환하는 것을 고려하세요.

지원되지 않는 유형에 대해 NotImplemented 반환:

피연산자가 다른 유형인 경우(아니요 상속), eq에서 NotImplemented를 반환하고 ne은 비교를 다른 피연산자의 반영된 메서드에 위임합니다. 이를 통해 교환성이 보장되고 집합을 사용하여 고유한 인스턴스를 결정할 수 있습니다.

해싱 및 집합 처리:

기본적으로 객체는 객체 식별자를 사용하여 해시됩니다. 집합 내에서 적절한 비교를 보장하려면 해시를 재정의하여 객체의 속성을 기반으로 일관된 해시를 계산하세요.

더욱 강력한 구현

이러한 고려 사항을 통합하면 더 강력한 결과를 얻을 수 있습니다. 객체 동등성을 위한 구현:

class Number:

    def __init__(self, number):
        self.number = number

    def __eq__(self, other):
        if isinstance(other, Number):
            return self.number == other.number
        return NotImplemented

    def __ne__(self, other):
        x = self.__eq__(other)
        if x is not NotImplemented:
            return not x
        return NotImplemented

    def __hash__(self):
        return hash(tuple(sorted(self.__dict__.items())))

이 구현은 전체에서 올바른 동등성과 해싱을 보장합니다. 하위 클래스 및 관련 없는 인스턴스를 사용하여 Python 클래스의 동등성을 지원하는 보다 우아하고 포괄적인 수단을 제공합니다.

위 내용은 Python 클래스에서 동등성을 달성하는 방법: __eq__, __ne__ 및 해싱에 대한 심층 분석?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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