isinstance и self.__class__ в классах в питоне

Объясните, пожалуйста, что такое self.__class__? То есть, например, когда используют функцию isinstance(), в скобках пишут объект и класс, имея ввиду проверку того, принадлежит ли этот объект этому классу. Но вот если есть такой класс:

class Rope:
    def __init__(self, length):
        self._length = length

    def __len__(self):
        # Переопределяем оператор len
        return self._length

    def __add__(self, other):
        # Переопределяем оператор +
        if isinstance(other, self.__class__):
            # Если второй объект (то с чем складываем) того же класса
            return Rope(self._length + other._length)  # возвращаем новый объект
        elif isinstance(other, (int, float)):
            # Если второй объект - число
            return Rope(self._length + other)  # возвращаем новый объект
        else:
            raise TypeError

почему у первого isinstance в скобках пишут self.__class__? Что это вообще значит? Мы же хотим проверить принадлежит ли объект other тому же классу, что и self. Но ведь self принадлежит классу Rope. Почему бы тогда не написать так: isinstance(other, Rope)? Тем более, что, если написать просто Rope, то и смотрится попроще. В чем отличие (other, self.__class__) от (other, Rope), если self принадлежит классу Rope? Заранее спасибо за ответ.


Ответы (1 шт):

Автор решения: Xander

Обычно isinstance(other, self.__class__) имеет смысл писать, если мы ожидаем, что от класса будут наследоваться другие классы, и мы хотим, чтобы тип сравнивался именно с типами тех дочерних классов, а не родительского Rope.

Но в данном коде в этом особого смысла нет, т.к. дальше идёт return Rope, то есть в дочернем классе этот метод наследовать без изменения не получится.

То есть для чего так написано в данном коде - надо спрашивать у автора этого кода, конкретно здесь это бессмыслено.

Если бы предполагалось, что от этого класса будут наследоваться другие, то ретурн надо было бы писать так: return self.__class__(self._length + other._length)

→ Ссылка