Знаете ли основные принципы объектно-ориентированного программирования
инкапсуляциянаследованиеобъектно-ориентированноеполиморфизмпринципы
Что проверяют
Знаете ли вы четыре принципа и понимаете ли, как они выглядят именно в Python, где многое держится на соглашениях, а не на запретах.
Как отвечать
Назовите принципы вместе со спецификой языка:
- инкапсуляция: настоящих модификаторов доступа нет. Одно подчёркивание это соглашение «внутреннее», двойное включает искажение имени и защищает от случайного совпадения в наследнике, но не от доступа. Для проверок при присваивании используют
property; - наследование: поддерживается, в том числе множественное, поэтому важен порядок разрешения методов.
super()идёт не «к родителю», а к следующему классу в этом порядке, и это ключевая деталь, о которой спрашивают; - полиморфизм: держится на утиной типизации. Функции всё равно, какого класса объект, лишь бы у него были нужные методы. Формальные контракты при желании задают через
abc.ABCи абстрактные методы или через протоколы изtyping, которые проверяются статически; - абстракция: интерфейс объекта отделяют от реализации, а магические методы (
__len__,__iter__,__enter__) позволяют встроить свой тип в язык так, что он ведёт себя как встроенный.
Хорошо, если добавите, что Python мультипарадигменный: не всё стоит превращать в классы, и модуль с функциями часто честнее класса с единственным методом. А для структур данных есть dataclass, который снимает шаблонный код.
Где спотыкаются
Говорят, что двойное подчёркивание делает атрибут приватным.
Не знают про порядок разрешения методов и ломают множественное наследование неправильными вызовами super().
Заводят классы ради классов, хотя задача решается функцией и словарём.