В данном коде определены:
🔘 Метакласс 𝙼 с атрибутом 𝚊𝚝𝚝𝚛 = 𝟷
🔘 Суперкласс 𝙰 с атрибутом 𝚊𝚝𝚝𝚛 = 𝟸
🔘 Класс 𝙱, который наследует от 𝙰 и использует метакласс 𝙼
Ключевой момент заключается в том, как работает наследование атрибутов в 𝙿𝚢𝚝𝚑𝚘𝚗.
Марк Лутц «Изучаем Python», глава 40:
«Экземпляры будут видеть имена в классе, но не в его метаклассе».
«__𝚍𝚒𝚌𝚝__ каждого класса в порядке 𝙼𝚁𝙾 (𝙼𝚎𝚝𝚑𝚘𝚍 𝚁𝚎𝚜𝚘𝚕𝚞𝚝𝚒𝚘𝚗 𝙾𝚛𝚍𝚎𝚛) просматривается к получению из экземпляра (отношение экземпляр−класс)»
В нашем случае:
🔘 Объект 𝚘𝚋𝚓 является экземпляром класса 𝙱
🔘 При обращении к 𝚘𝚋𝚓.𝚊𝚝𝚝𝚛 𝙿𝚢𝚝𝚑𝚘𝚗 ищет атрибут в порядке 𝙼𝚁𝙾
🔘 Класс 𝙱 наследует от суперкласса 𝙰, поэтому 𝚊𝚝𝚝𝚛 = 𝟸 из класса 𝙰 становится доступным для экземпляров 𝙱
🔘 Атрибут 𝚊𝚝𝚝𝚛 = 𝟷 из метакласса 𝙼 недоступен для экземпляров класса 𝙱
«Если класс определяется с помощью метакласса, он должен передать имена, полученные из метакласса, используя наследование от суперкласса».
Поэтому код выводит 𝟸 — значение атрибута 𝚊𝚝𝚝𝚛 из суперкласса 𝙰.
Post #4325
690