Метакласс Python: created_by у Base и Child

При запуске файла как программы будут выведены Meta и True. Метакласс добавляет created_by при создании и Base, и Child.

Короткий ответ

Что ответить на собеседовании

При запуске файла как программы будут выведены Meta и True. Метакласс добавляет created_by при создании и Base, и Child.

Подробный разбор

Ответ с пояснениями

Условие

Что выведет?

class Meta(type):
    def __new__(cls, name, bases, namespace):
        namespace['created_by'] = 'Meta'
        return super().__new__(cls, name, bases, namespace)

class Base(metaclass=Meta):
    pass

class Child(Base):
    pass

if __name__ == '__main__':
    print(Child.created_by)  # Что выведет?
    print(hasattr(Base, 'created_by'))  # А здесь?

Ответ

При запуске файла как программы будут выведены Meta и True. Метакласс добавляет created_by при создании и Base, и Child.

В Meta.__new__ словарь пространства имён класса получает created_by = 'Meta', после чего type.__new__ создаёт класс. Child наследует метакласс от Base, поэтому этот шаг выполняется и для него.

Meta
True

В данном примере атрибут есть непосредственно в обоих классах, а не только находится у Child через наследование. Если файл импортирован как модуль, блок if __name__ == '__main__' не выполняется, хотя сами классы всё равно создаются.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее