При запуске файла как программы будут выведены Meta и True. Метакласс добавляет created_by при создании и Base, и Child.
Метакласс Python: 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__' не выполняется, хотя сами классы всё равно создаются.