Python에서 사용자 정의 클래스를 정의하려면 특수 메서드를 사용하여 동등 비교를 구현해야 하는 경우가 많습니다. , eq 및 ne__. 일반적인 접근 방식은 인스턴스의 __dict 속성을 비교하는 것입니다.
__dict__s를 비교하면 다음을 쉽게 확인할 수 있습니다. 평등:
def __eq__(self, other): if isinstance(other, self.__class__): return self.__dict__ == other.__dict__ else: return False
이 접근 방식은 편리하지만 단점:
dict 비교를 사용하는 것보다 더 우아한 대안이 있습니다:
1. __slots__ 정의:
클래스에서 슬롯을 선언하여 인스턴스 속성을 특정 속성으로 제한합니다.
class Foo: __slots__ = ['item'] def __init__(self, item): self.item = item
이렇게 하면 비교가 효율적이고 임의 추가를 방지할 수 있습니다. 인스턴스에 속성을 부여합니다.
2. 명명된 튜플 사용:
Python의 명명된 튜플을 활용하여 사전 정의된 속성으로 클래스를 빠르게 정의합니다.
from collections import namedtuple Foo = namedtuple('Foo', ['item'])
namedtuple은 기본적으로 동등 비교를 지원합니다.
3. hash 및 __eq__를 정의합니다:
hash를 재정의하여 중요한 클래스 속성을 기반으로 해시를 반환하고 동일한 개체에 대해 고유한 해시를 보장합니다. 그런 다음 eq를 구현하여 해시가 아닌 속성을 기준으로 개체를 비교합니다.
class Foo: def __init__(self, item): self.item = item def __hash__(self): return hash(self.item) def __eq__(self, other): return self.item == other.item
4. 메타클래스 사용:
메타클래스를 사용하면 사용자 정의 동작으로 클래스를 동적으로 생성할 수 있습니다. 클래스 속성을 기반으로 eq 및 ne 메서드를 자동으로 정의하는 메타클래스를 생성할 수 있습니다.
class MyMeta(type): def __new__(cls, name, bases, dct): attributes = tuple(dct.keys()) def __eq__(self, other): return all(getattr(self, attr) == getattr(other, attr) for attr in attributes) dct['__eq__'] = __eq__ return super().__new__(cls, name, bases, dct)
5. 사용자 정의 기본 클래스에서 상속:
원하는 동작에 대해 이미 정의된 eq 및 hash를 사용하여 기본 클래스를 만듭니다. 다른 클래스는 이 기본 클래스에서 상속하여 동등 비교 기능의 이점을 누릴 수 있습니다.
__dict__s를 비교하는 것은 간단한 해결책일 수 있지만 동등 비교를 구현하는 데 사용할 수 있는 더 우아하고 효율적인 접근 방식이 있습니다. 파이썬 수업에서. 방법 선택은 애플리케이션의 특정 요구 사항에 따라 다릅니다.
위 내용은 Python 클래스에서 동등 비교를 우아하게 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!