2554
Комментарий:
|
← Версия 8 от 2019-12-02 11:30:05 ⇥
2593
|
Удаления помечены так. | Добавления помечены так. |
Строка 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
Спойлер: