Какие механизмы инкапсуляции реализованы в Python?
Что проверяют
Для ML-инженера это вопрос не столько про синтаксис, сколько про умение писать переиспользуемый код вокруг моделей: трансформеры, датасеты, обёртки над инференсом. Проверяют, знаете ли вы, что жёсткой приватности в Python нет, и понимаете ли соглашения библиотек, с которыми работаете каждый день. Следом могут попросить написать свой трансформер для scikit-learn.
Как отвечать
Сначала база: в Python нет private и protected, инкапсуляция держится на именах и протоколе атрибутов.
_name: внутренняя деталь по соглашению, интерпретатор доступ не запрещает;__name: name mangling превращает имя в_ClassName__name. Это защита от конфликта имён при наследовании, а не приватность;@property: вычисляемый атрибут или проверка при записи с синтаксисом обычного поля;__slots__и@dataclass(frozen=True): фиксированный набор полей и неизменяемые конфиги экспериментов.
Затем покажите, как это выглядит в ML-стеке:
- scikit-learn: в
__init__параметры сохраняются как есть, без валидации, потому чтоget_params()иclone()читают их по сигнатуре конструктора. Всё, что вычислено вfit, получает суффикс подчёркивания:coef_,classes_,n_features_in_. По таким атрибутамcheck_is_fittedпонимает, обучена ли модель; - PyTorch:
nn.Moduleперехватывает__setattr__и регистрирует присвоенные параметры и подмодули. Тензор, который должен ехать с моделью на устройство и вstate_dict, но не обучаться, оформляют черезregister_buffer; - pydantic: схемы входа и выхода сервиса инференса, валидация данных на границе модели.
Практический смысл: предобработка, спрятанная внутри Pipeline или класса модели, не расходится между обучением и продом.
Где спотыкаются
Валидируют или преобразуют параметры в __init__ своего трансформера. Тогда clone() внутри GridSearchCV либо падает с ошибкой, либо перебор идёт не по тем значениям.
Называют __name приватным полем, которое нельзя прочитать. Оно доступно по искажённому имени.
Хранят служебный тензор обычным атрибутом nn.Module. Он не попадает в state_dict и не переезжает на GPU вместе с model.to(device).