본문 바로가기
파이썬

파이썬 Python 3에서 Python 2와 마찬가지로 __cmp__ 메서드를 사용할 수없는 이유는 무엇입니까?

by º기록 2020. 9. 23.
반응형

다음 코드

class point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def dispc(self):
        return ('(' + str(self.x) + ',' + str(self.y) + ')')

    def __cmp__(self, other):
        return ((self.x > other.x) and (self.y > other.y))

Python 2에서는 잘 작동하지만 Python 3에서는 오류가 발생합니다.

>>> p=point(2,3)
>>> q=point(3,4)
>>> p>q
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: point() > point()

== ! = 에서만 작동합니다.

 

해결 방법

 


__ cmp __ 는 더 이상 사용되지 않습니다 .

보다 구체적으로, __ lt __ self other 를 인수로 취하며 self 기타 . 예를 들면 :

class Point(object):
    ...
    def __lt__(self, other):
        return ((self.x < other.x) and (self.y < other.y))

(이것은 현명한 비교 구현은 아니지만 원하는 것을 말하기는 어렵습니다.)

따라서 다음과 같은 상황이 발생하면 :

p1 = Point(1, 2)
p2 = Point(3, 4)

p1 < p2

이것은 다음과 동일합니다.

p1.__lt__(p2)

True 를 반환합니다.

__ eq __ 는 포인트가 같으면 True 를 반환하고 그렇지 않으면 False 를 반환합니다. 다른 방법도 유사하게 작동합니다.


from functools import total_ordering

@total_ordering
class Point(object):
    def __lt__(self, other):
        ...

    def __eq__(self, other):
        ...

 

참조 페이지 https://stackoverflow.com/questions/8276983

 

 

반응형

댓글