Рассмотрим задачу сравнения двух инстансов простого класса A в Python. Сам класс A выглядит так:
class A(object): def init(self, int_param): self.int_value = int_param
В данном случае, если мы выполним такой код:
a1 = A(1)a2 = A(1)
то инстансы этого классы не будут равны между собой:
a1 == a2 - Falsea1 is a2 - False
Чтобы понять как это все работает и почему получается такой результат рассмотрим функцию id(object). Функция id() возвращает идентификатор объекта, который будет уникальным и неизменным на протяжении времени жизни объекта. В CPython эта функция возвращает адрес объекта в памяти. В моем случае это:
id(a1)=4299743824id(a2)=4299743888
Теперь, если мы посмотрим на документацию оператора is, то увидем, что он возвращает True, только в случае, если, в нашем случае a1 и a2, - один и тот же объект. В таком случае, если сделать a3=a1, то получим:
a3 == a1 - Truea3 is a1 - True
Оператор “==” сравнивает объекты с помощью метода cmp, который может возвращать одно из 3-х значений:
- -1 - в случае, когда один объект “меньше” (<) другого;
- 1 - в случае, когда один объект “больше” (>) другого;
- 0 - объекты равны (==).
Самая простая реализация этого метода выглядит так:
class B(object): def init(self, int_param): self.int_value = int_param def cmp(self, other): if self.int_value < other: return -1 elif self.int_value > other: return 1 else: return 0
После этого получаем такой вывод:
b1 = B()b2 = B()b1 == b2 - Trueb1 is b2 - False
Примеры кода, традиционно, на GitHub’e: https://github.com/e0ne/BlogSamples/tree/master/PythonEquals