В python - оператор, который набор использует для проверки, находится ли объект в наборе - PullRequest
10 голосов
/ 30 декабря 2011

Если у меня есть список объектов, я могу использовать метод __cmp__ для переопределения объектов сравнения.Это влияет на работу оператора == и функцию item in list.Однако это, похоже, не влияет на функцию item in set - мне интересно, как я могу изменить объект MyClass, чтобы я мог переопределить поведение, как набор сравнивает элементы.

Например, я бынравится создавать объект, который возвращает True в трех операторах печати внизу.На данный момент последний оператор print возвращает False.

class MyClass(object):
    def __init__(self, s):
        self.s = s
    def __cmp__(self, other):
        return cmp(self.s, other.s)

instance1, instance2 = MyClass("a"), MyClass("a")

print instance2==instance1             # True
print instance2 in [instance1]         # True
print instance2 in set([instance1])    # False

1 Ответ

9 голосов
/ 30 декабря 2011

set использует __hash__ для сравнения.Отмените это, и вы будете в порядке:

class MyClass(object):
    def __init__(self, s):
        self.s = s
    def __cmp__(self, other):
        return cmp(self.s, other.s)
    def __hash__(self):
        return hash(self.s) # Use default hash for 'self.s'

instance1, instance2 = MyClass("a"), MyClass("a")
instance3 = MyClass("b")

print instance2==instance1             # True
print instance2 in [instance1]         # True
print instance2 in set([instance1])    # True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...