Унаследуйте 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.