Различия между версиями 7 и 8
Версия 7 от 2019-12-02 11:29:03
Размер: 2554
Редактор: FrBrGeorge
Комментарий:
Версия 8 от 2019-12-02 11:30:05
Размер: 2593
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 25: Строка 25:
Спойлер: /* у нас есть `eval()`, точнее [[py3doc:functions.html#exec|exec()]]. Мы прямо в определении класса пишем код, который в цикле для всех `callable()`-полей из `str.__dict__` сначала строит строку с кодом соответствующего `def` (который вызывает ту самую обёртку), а затем `exec()`-ет эту строку. Исключения: `__class__`, `__new__`, `__getattribute__`, `__getattr__`, `__repr__`, `__str__` */ Спойлер: /* у нас есть `eval()`, точнее [[py3doc:functions.html#exec|exec()]]. Мы прямо в определении класса пишем код, который в цикле для всех `callable()`-полей из `str.__dict__` сначала строит строку с кодом соответствующего `def` (который вызывает ту самую обёртку), а затем `exec()`-ет эту строку. Исключения: `__class__`, `__new__`, `__getattribute__`, `__getattr__`, `__repr__`, `__str__` , их вообще не трогаем*/

Написать класс DivStr(str), полностью (за исключением правых операций со строками и split()/splitlines()) воспроизводящий работу str. Дополнительно класс должен поддерживать операцию деления «/n», где n — натуральное число, которая должна возвращать n-ю часть от начала строки (если не делится, округлённую в меньшую сторону, если n>len(s) — пустую строку). Задача в том, чтобы любое возвращаемое методами значение типа str превращалось в DivStr. Согласно документации, мы не можем подсунуть методы, начинающиеся на «__», прямо в __dict__, или поймать __getattr__-ом, или даже __getattribute__-ом, а должны задать их явно, например, с помощью def. С другой стороны, руками все методы перебивать не хочется. См. далее.

Подсказка: для всех методов (кроме нескольких, пречисленных в спойлере) будет единственная обёртка: вызвать соответствующий метод str со всеми параметрами, и если он вернул объект типа str, обернуть в DivStr, а остальное оставить без изменения.

s = DivStr("Qwertupy")
print(len(s))
print(s*3/2)
print((s+"ZZZZZZZZZZ")/2)
print(s[3:]/2)
print(s[0].join("12345678")/2) 

8
QwertupyQwer
QwertupyZ
rt
1Q2Q3Q4

Спойлер:


CategoryHomework

LecturesCMC/PythonIntro2019/Homework_DivStr (последним исправлял пользователь FrBrGeorge 2019-12-02 11:30:05)