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 шт):
Обычно isinstance(other, self.__class__) имеет смысл писать, если мы ожидаем, что от класса будут наследоваться другие классы, и мы хотим, чтобы тип сравнивался именно с типами тех дочерних классов, а не родительского Rope.
Но в данном коде в этом особого смысла нет, т.к. дальше идёт return Rope, то есть в дочернем классе этот метод наследовать без изменения не получится.
То есть для чего так написано в данном коде - надо спрашивать у автора этого кода, конкретно здесь это бессмыслено.
Если бы предполагалось, что от этого класса будут наследоваться другие, то ретурн надо было бы писать так: return self.__class__(self._length + other._length)