Рассмотрим задачу сравнения двух инстансов простого класса A в Python. Сам класс A выглядит так:

class A(object):
    def __init__(self, int_param):
        self.int_value = int_param

В данном случае, если мы выполним такой код:

a1 = A(1)
a2 = A(1)

то инстансы этого классы не будут равны между собой:

a1 == a2 - False
a1 is a2 - False

Чтобы понять как это все работает и почему получается такой результат рассмотрим функцию id(object). Функция id() возвращает идентификатор объекта, который будет уникальным и неизменным на протяжении времени жизни объекта. В CPython эта функция возвращает адрес объекта в памяти. В моем случае это:

id(a1)=4299743824
id(a2)=4299743888

Теперь, если мы посмотрим на документацию оператора is, то увидем, что он возвращает True, только в случае, если, в нашем случае a1 и a2, - один и тот же объект. В таком случае, если сделать a3=a1, то получим:

a3 == a1 - True
a3 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 - True
b1 is b2 - False

Примеры кода, традиционно, на GitHub’e: https://github.com/e0ne/BlogSamples/tree/master/PythonEquals

 


Comments

Mihail Russia

Friday, December 23, 2011 1:07 PM

Mihail

1) в coComment не работает авторизация через OpenId google
2) в предложении "Рассмотрим задачу сравнения двух простых классов A в Python" опечатка.
   В данном случае, классы не сравниваются между собой, сравниваются экземпляры класса/ов.

e0ne United States

Friday, December 23, 2011 1:58 PM

e0ne

1. Давно собираюсь что-то с комментариями сделать, возможно, вообще на disqus переведу.
2. Спасибо, конечно имелось в виде инстансы классном. Исправил.

Comments are closed