Подтвердить что ты не робот

Приоритет равенства python

class L(object):
    def __eq__(self, other):
        print 'invoked L.__eq__'
        return False

class R(object):
    def __eq__(self, other):
        print 'invoked R.__eq__'
        return False

left = L()
right = R()

С этим кодом левая сторона получает первый снимок при сравнении, как документально в модели данных:

>>> left == right
invoked L.__eq__
False

Но если мы сделаем небольшую модификацию на строке 6 (все остальное одно и то же):

class R(L):

Теперь правая сторона получает первый выстрел при сравнении.

>>> left == right
invoked R.__eq__
False

Почему? Где это задокументировано, и в чем причина дизайнерского решения?

4b9b3361

Ответ 1

Это описано в числовых операциях, далее на странице, с объяснением, почему это работает именно так:

Примечание. Если правый тип операндов является подклассом типа левых операндов, и этот подкласс предоставляет отраженный метод для операции, этот метод будет вызываться перед левым операндом, не отраженным методом. Такое поведение позволяет подклассам переопределять операции своих предков.

Документация Python 3 дополнительно упоминает об этом в разделе, которое вы искали:

Если операнды имеют разные типы, а тип правильных операндов является прямым или косвенным подклассом типа левых операндов, метод отражения правильного операнда имеет приоритет, иначе метод левых операндов имеет приоритет. Виртуальное подклассирование не рассматривается.