Вопросы к экзамену 2 по ООП (Python)
Только вопросы для самопроверки — без ответов. Ответы см. в
private_exam_answers_2.md, практические задачи — в private_exam_tasks_2.md,
билеты — в private_exam_tickets_2.md.
Экзамен 2 — весь курс: 25 простых вопросов (понимание) и 25 сложных (анализ кода и проектные решения).
Часть 1. Простые вопросы (25)
- Чем класс отличается от объекта?
- Перечислите четыре принципа ООП.
- Как в Python реализуется инкапсуляция?
- Что такое name mangling и во что превращается
__tokenв классеSecret? - Какой алгоритм определяет порядок поиска методов при множественном наследовании?
- Что такое полиморфизм и как он проявляется в Python?
- Чем композиция отличается от агрегации?
- Расшифруйте аббревиатуру SOLID.
- Что делает декоратор
@property? - Чем отличаются
@classmethodи@staticmethod? - Назовите магические методы для строкового представления объекта.
- Что такое миксин (mixin)?
- Зачем нужен абстрактный базовый класс (
abc.ABC)? - Что такое контекстный менеджер и какие методы он реализует?
- От какого класса следует наследовать собственные исключения и почему не от
BaseException? - Чем опасен
except:без указания типа? - Для чего используется
raise ... from ...? - Что такое паттерн Repository?
- В чём суть Dependency Injection?
- Чем отличаются MVC, MVP и MVVM по связи View и Model?
- Что такое дескриптор?
- Чем data-дескриптор отличается от non-data-дескриптора?
- Что делает
__slots__? - Что такое метакласс? Какой метакласс по умолчанию?
- Какой хук вызывается при создании каждого подкласса и зачем он удобен?
Часть 2. Сложные вопросы (25)
- Сформулируйте принцип подстановки Лисков (LSP) и приведите пример его нарушения с исправлением.
- Объясните разницу
__str__и__repr__. Что вызовется вprint(obj),str([obj])и f-строкеf"{obj!r}"? - Что выведет код и почему?
- Реализуйте паттерн «Стратегия» так, чтобы стратегию можно было менять в рантайме, и объясните, чем он лучше цепочки
if/elif. - Чем различаются связанное (
__cause__) и неявное (__context__) сцепление исключений? - Спроектируйте иерархию пользовательских исключений для HTTP-клиента и покажите, как одна обработка ловит подгруппу.
- Реализуйте паттерн «Retry с экспоненциальной задержкой» как декоратор. На какие исключения он не должен реагировать?
- Почему нарушение принципа инверсии зависимостей (DIP) мешает тестированию, и как DI это решает?
- Подробно опишите алгоритм
object.__getattribute__дляobj.xс учётом дескрипторов. - Что выведет код и почему?
- Реализуйте
LazyPropertyи объясните, почему он обязан быть non-data-дескриптором. - Почему
@propertyне «затирается» присваиванием атрибута экземпляра, а обычный метод — да? - Сравните три способа добавить валидацию полю:
property, дескриптор,__setattr__. - Объясните
metaclass conflictпри множественном наследовании и способ его устранения. - Реализуйте метакласс-синглтон и объясните, почему он надёжнее переопределения
__new__. - Когда
__slots__перестаёт экономить память и почему конфликтуют непустые слоты при множественном наследовании? - Чем
__init_subclass__предпочтительнее метакласса для регистрации плагинов, и где метакласс всё же необходим? - Что не так с этим «замороженным» объектом и как исправить?
- Что нарушает принцип единственной ответственности (SRP) в классе ниже и как разделить?
- Объясните паттерн Unit of Work и его связь с транзакционностью.
- Почему утиная типизация и
Protocol(структурная типизация) часто предпочтительнее наследования от ABC? В чём компромисс? - Что выведет код и почему (декоратор класса против метакласса)?
- Реализуйте контекстный менеджер двумя способами (класс и
contextlib) и объясните роль возвращаемого значения__exit__. - Где хранить состояние дескриптора и почему ключ
id(instance)в словаре дескриптора — плохая идея? - Спроектируйте архитектуру приложения «заметки» по слоям и объясните, какой ООП-инструмент применяется на каждом уровне.