Равенство объектов в Python

У меня есть класс MyClass, который содержит две переменные-члены foo и bar:

class MyClass:
    def __init__(self, foo, bar):
        self.foo = foo
        self.bar = bar

У меня есть два экземпляра этого класса, каждый из которых имеет одинаковые значения для foo и bar:

x = MyClass('foo', 'bar')
y = MyClass('foo', 'bar')

Однако, когда я сравниваю их на равенство, Python возвращает False:

>>> x == y
False

Как я могу заставить python считать эти два объекта равными?


person Rory    schedule 27.04.2012    source источник
comment
Переопределить __cmp__ метод класса.   -  person Fenikso    schedule 27.04.2012


Ответы (2)


вы должны указать python, как именно вы хотите определить равенство. сделайте это, определив специальный метод __eq__ следующим образом:

def __eq__(self, other):
    return self.attrfoo == other.attrfoo # change that to your needs

__cmp__(self, other) - это "старый" стиль для сравнения экземпляров классов, используемый только тогда, когда rich comparison специальный метод не найден. читайте о них здесь: http://docs.python.org/release/2.7/reference/datamodel.html#specialnames

person ch3ka    schedule 27.04.2012
comment
Если вы определяете __eq__, не забудьте также определить __ne__, чтобы предотвратить неожиданности. - person Petr Viktorin; 27.04.2012
comment
Не забудьте также определить __ne__: в ответе должно быть указано явно. Забыть об этом может быть очень сложно. - person zezollo; 27.07.2017

Стандартный протокол должен определить __cmp__() или _ 2_ и __ne__().

Если вы этого не сделаете, Python использует идентификацию объекта («адрес») для сравнения объектов.

person NPE    schedule 27.04.2012
comment
вы имеете в виду, что Python будет проверять, находятся ли они в одной памяти? - person UniSize; 06.08.2020