Перейти к содержимому

Вопросы к экзамену 2 по ООП (Python)

Только вопросы для самопроверки — без ответов. Ответы см. в private_exam_answers_2.md, практические задачи — в private_exam_tasks_2.md, билеты — в private_exam_tickets_2.md.

Экзамен 2 — весь курс: 25 простых вопросов (понимание) и 25 сложных (анализ кода и проектные решения).


Часть 1. Простые вопросы (25)

  1. Чем класс отличается от объекта?
  2. Перечислите четыре принципа ООП.
  3. Как в Python реализуется инкапсуляция?
  4. Что такое name mangling и во что превращается __token в классе Secret?
  5. Какой алгоритм определяет порядок поиска методов при множественном наследовании?
  6. Что такое полиморфизм и как он проявляется в Python?
  7. Чем композиция отличается от агрегации?
  8. Расшифруйте аббревиатуру SOLID.
  9. Что делает декоратор @property?
  10. Чем отличаются @classmethod и @staticmethod?
  11. Назовите магические методы для строкового представления объекта.
  12. Что такое миксин (mixin)?
  13. Зачем нужен абстрактный базовый класс (abc.ABC)?
  14. Что такое контекстный менеджер и какие методы он реализует?
  15. От какого класса следует наследовать собственные исключения и почему не от BaseException?
  16. Чем опасен except: без указания типа?
  17. Для чего используется raise ... from ...?
  18. Что такое паттерн Repository?
  19. В чём суть Dependency Injection?
  20. Чем отличаются MVC, MVP и MVVM по связи View и Model?
  21. Что такое дескриптор?
  22. Чем data-дескриптор отличается от non-data-дескриптора?
  23. Что делает __slots__?
  24. Что такое метакласс? Какой метакласс по умолчанию?
  25. Какой хук вызывается при создании каждого подкласса и зачем он удобен?

Часть 2. Сложные вопросы (25)

  1. Сформулируйте принцип подстановки Лисков (LSP) и приведите пример его нарушения с исправлением.
  2. Объясните разницу __str__ и __repr__. Что вызовется в print(obj), str([obj]) и f-строке f"{obj!r}"?
  3. Что выведет код и почему?
  4. Реализуйте паттерн «Стратегия» так, чтобы стратегию можно было менять в рантайме, и объясните, чем он лучше цепочки if/elif.
  5. Чем различаются связанное (__cause__) и неявное (__context__) сцепление исключений?
  6. Спроектируйте иерархию пользовательских исключений для HTTP-клиента и покажите, как одна обработка ловит подгруппу.
  7. Реализуйте паттерн «Retry с экспоненциальной задержкой» как декоратор. На какие исключения он не должен реагировать?
  8. Почему нарушение принципа инверсии зависимостей (DIP) мешает тестированию, и как DI это решает?
  9. Подробно опишите алгоритм object.__getattribute__ для obj.x с учётом дескрипторов.
  10. Что выведет код и почему?
  11. Реализуйте LazyProperty и объясните, почему он обязан быть non-data-дескриптором.
  12. Почему @property не «затирается» присваиванием атрибута экземпляра, а обычный метод — да?
  13. Сравните три способа добавить валидацию полю: property, дескриптор, __setattr__.
  14. Объясните metaclass conflict при множественном наследовании и способ его устранения.
  15. Реализуйте метакласс-синглтон и объясните, почему он надёжнее переопределения __new__.
  16. Когда __slots__ перестаёт экономить память и почему конфликтуют непустые слоты при множественном наследовании?
  17. Чем __init_subclass__ предпочтительнее метакласса для регистрации плагинов, и где метакласс всё же необходим?
  18. Что не так с этим «замороженным» объектом и как исправить?
  19. Что нарушает принцип единственной ответственности (SRP) в классе ниже и как разделить?
  20. Объясните паттерн Unit of Work и его связь с транзакционностью.
  21. Почему утиная типизация и Protocol (структурная типизация) часто предпочтительнее наследования от ABC? В чём компромисс?
  22. Что выведет код и почему (декоратор класса против метакласса)?
  23. Реализуйте контекстный менеджер двумя способами (класс и contextlib) и объясните роль возвращаемого значения __exit__.
  24. Где хранить состояние дескриптора и почему ключ id(instance) в словаре дескриптора — плохая идея?
  25. Спроектируйте архитектуру приложения «заметки» по слоям и объясните, какой ООП-инструмент применяется на каждом уровне.