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
마지막으로, 집합은 개체 식별자를 사용한다는 점에 유의하세요. 잘못된 결과로 이어질 수 있는 해싱:
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!