>백엔드 개발 >파이썬 튜토리얼 >특히 서브클래스와 세트를 처리할 때 사용자 정의 Python 클래스에 대한 일관되고 강력한 동등성 비교를 어떻게 보장합니까?

특히 서브클래스와 세트를 처리할 때 사용자 정의 Python 클래스에 대한 일관되고 강력한 동등성 비교를 어떻게 보장합니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-09 04:50:02455검색

How do you ensure consistent and robust equivalence comparisons for custom Python classes, especially when dealing with subclasses and sets?

Python 클래스의 동등성 비교를 위한 우아한 접근 방식

Python에서 사용자 정의 클래스는 __eq__ 및 __ne__ 메서드를 구현하여 == 및 != 연산자에 대한 동등성을 정의할 수 있습니다. 각기. 사전 속성을 비교하는 기존 방법은 간단하지만 몇 가지 제한 사항이 있습니다.

더 세련된 접근 방식

다음 시나리오를 고려하세요.

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

n1 = Number(1)
n2 = Number(1)

# Default comparison fails: they are different objects
assert n1 != n2

이 문제를 해결하려면 , __eq__ 메서드를 재정의할 수 있습니다:

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

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

그러나 Python 2의 경우 교환 동작을 보장하기 위해 __ne__도 구현해야 합니다.

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

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

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

이렇게 하면 n1 == n2가 보장됩니다. 예상대로 True로 평가됩니다.

하위 클래스 동등성

하위 클래스를 도입하면 동등성 비교가 복잡해집니다.

class SubNumber(Number):
    pass

n3 = SubNumber(1)

# Subclass comparison fails for classic-style classes
assert n1 == n3  # False (for classic-style classes)
assert n3 == n1  # True

# Non-commutative comparison
assert n1 != n3  # True (for classic-style classes)
assert n3 != n1  # False

클래식 스타일 클래스의 경우 비교 메서드는 다음을 기반으로 호출됩니다. 첫 번째 피연산자의 유형으로 인해 비가환 동작이 발생합니다. 이 문제를 해결하기 위해 지원되지 않는 피연산자 유형에 대해 NotImplemented를 반환하여 다른 피연산자의 메서드에 비교를 위임할 수 있습니다.

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

Hashing 및 Set

마지막으로, 집합은 개체 식별자를 사용한다는 점에 유의하세요. 잘못된 결과로 이어질 수 있는 해싱:

assert len(set([n1, n2, n3])) == 3  # Incorrectly reports 3 unique numbers

이 문제를 해결하려면 __hash__ 메서드를 재정의할 수 있습니다.

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

이러한 향상된 기능을 통해 동등성 및 고유성 동작이 정확해지고 일관되고 확실한 비교와 세트 내 정확한 표현 보장:

assert len(set([n1, n2, n3])) == 1
assert len(set([n1, n2, n3, n4])) == 2

위 내용은 특히 서브클래스와 세트를 처리할 때 사용자 정의 Python 클래스에 대한 일관되고 강력한 동등성 비교를 어떻게 보장합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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