programing

python 사용자 정의 클래스 정렬 가능, 해시 가능하게 만들기

magicmemo 2023. 8. 19. 10:06
반응형

python 사용자 정의 클래스 정렬 가능, 해시 가능하게 만들기

python에서 사용자 정의 클래스를 정렬 및/또는 해시 가능하게 할 때 재정의/구현해야 하는 방법은 무엇입니까?

조심해야 할 고차는 무엇입니까?

I형dir({})내 통역사에게 입력하여 내장된 딕트에 대한 방법 목록을 가져옵니다.그 중에서, 저는 몇 가지 부분 집합을 구현해야 한다고 생각합니다.

['__cmp__', '__eq__', '__ge__', '__gt__', '__hash__', '__le__', '__lt__', '__ne__']

Python2와 반대로 Python3에 대해 구현해야 하는 방법에 차이가 있습니까?

다른 답변에 댓글로 올릴 뻔했는데 그 자체가 답입니다.

항목을 정렬할 수 있도록 하려면 항목을 구현하기만 하면 됩니다.__lt__그것이 내장된 정렬에서 사용하는 유일한 방법입니다.

다른 비교 또는functools.total_ordering클래스와 비교 연산자를 실제로 사용하려는 경우에만 필요합니다.

항목을 해시 가능하게 만들려면 다음을 구현합니다.__hash__다른 사람들이 지적한 바와 같이또한 다음을 구현해야 합니다.__eq__호환되는 방식으로 - 동등한 항목은 동일하게 해시해야 합니다.

파이썬 2와 3은 차이가 없습니다.

정렬 가능성:

비교 방법을 정의해야 합니다.이렇게 하면 항목을 정렬할 수 있습니다.일반적으로, 당신은 선호하지 말아야 합니다.__cmp__().

저는 주로 functools.total_ordering 데코레이터를 사용합니다.

functools.total_ordering(cls) 하나 이상의 리치 비교 순서 메서드를 정의하는 클래스가 주어지면 이 클래스 장식자는 나머지를 제공합니다.따라서 가능한 리치 비교 작업을 모두 지정하는 데 필요한 작업이 간소화됩니다.

클래스는 다음 중 하나를 정의해야 합니다.__lt__(),__le__(),__gt__()또는__ge__()또한, 클래스는 다음을 제공해야 합니다.__eq__()방법.

비교 방법에 부작용이 없도록 주의해야 합니다.(객체의 값 중 하나를 변경합니다.

해시의 경우:

구현해야 합니다.__hash__()방법.내 생각에 가장 좋은 방법은 돌아오는 것입니다.hash(repr(self))그래서 당신의 해시는 독특할 것입니다.

개체를 정렬 가능으로 표시하는 몇 가지 방법이 있습니다.함수 집합에 의해 정의되는 첫 번째 - 리치 비교:

object.__lt__(self, other)
object.__le__(self, other)
object.__eq__(self, other)
object.__ne__(self, other)
object.__gt__(self, other)
object.__ge__(self, other)

또한 하나의 함수만 정의할 수 있습니다.

object.__cmp__(self, other)

사용자 지정을 정의하려면 마지막을 정의해야 합니다.__hash__기능.의사를 참조하십시오.

시행하다__lt__(self,other)메소드는 클래스를 정렬할 수 있도록 하는 답입니다.
내장된 방식뿐만 아니라sorted(iterable) 또우 순위대를 통한 큐:heapq모듈.

파이썬의에 들지 않아서 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ'__ge__', '__gt__', '__le__', '__lt__', '__ne__'방법은 전혀 직관적이지 않습니다!
대으로적, 의바자조.Interface Comparable<T>(java doc 참조) 이 개체가 직접적이고 친숙한 지정된 개체보다 작거나 같거나 크기 때문에 음수 정수, 0 또는 양수를 반환합니다!

언급URL : https://stackoverflow.com/questions/7152497/making-a-python-user-defined-class-sortable-hashable

반응형