Перегрузка оператора вычитания для пользовательского строкового класса

Унаследуйте String от str и реализуйте __sub__: удаляйте только совпавший префикс срезом, иначе возвращайте исходное содержимое.

Короткий ответ

Что ответить на собеседовании

Унаследуйте String от str и реализуйте sub: удаляйте только совпавший префикс срезом, иначе возвращайте исходное содержимое.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо реализовать собственный класс String, который поддерживает вычитание одной строки из другой с помощью оператора -. Если первая строка начинается с подстроки, переданной во втором объекте, из неё следует удалить эту подстроку, иначе возвращается оригинальная строка. Для реализации следует переопределить соответствующий магический метод.


def dif_str(a: str, b: str) -> str:
    if a.startswith(b):
        return a.replace(b, '', 1)
    return a

Ответ

Унаследуйте String от str и реализуйте sub: удаляйте только совпавший префикс срезом, иначе возвращайте исходное содержимое.

class String(str):
    def __sub__(self, other):
        if not isinstance(other, str):
            return NotImplemented
        if self.startswith(other):
            return String(self[len(other):])
        return String(self)

assert String('ababx') - String('ab') == 'abx'
assert String('hello') - 'x' == 'hello'

Срез удаляет ровно начальное вхождение, не затрагивая совпадения внутри строки. Пустой префикс ничего не меняет, а вычитание всей строки даёт пустую строку. Возвращается String, поэтому результат поддерживает дальнейшее вычитание. Неподдерживаемый тип операнда приводит к стандартному механизму TypeError.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее