Операции на месте не гарантируют, что они обновят объект на месте, они полностью зависят от типа объекта.
Tuple, frozenset и т. Д. Являются неизменяемыми типами, следовательно, этоневозможно обновить их на месте.
С ссылка на библиотеку для операторов на месте:
Для неизменяемых целей, таких как строки, числа и кортежиобновленное значение вычисляется, но не присваивается обратно входной переменной.
Аналогично, в документах frozenset
также упоминается то же самое в операциях на месте [ source ]:
В следующей таблице перечислены операции, доступные для набора, которые не применяются к неизменяемым экземплярам frozenset.
Теперь, как вашOCDFrozenSet
не реализует __isub__
, он вернется к методу __sub__
, который вернет тип базового класса frozenset
.Базовый класс используется, потому что Python не имеет представления об аргументах, которые ваш базовый класс ожидает от вновь созданного frozenset
от операции __sub__
.
Что еще более важно, это была ошибка в Python 2, когда такая операция возвращала экземпляр подкласса, исправление было только перенесено на Python 3 , хотя для предотвращения взлома существующих систем.
Чтобы получить ожидаемый результат, вы можете предоставитьнеобходимые методы в вашем подклассе:
class OCDFrozenSet(frozenset):
def __sub__(self, other):
return type(self)(super().__sub__(other))
def __rsub__(self, other):
return type(self)(super().__rsub__(other))