TGViewer
Python: задачки и вопросы Python: задачки и вопросы @quiz_python · 6.93K subscribers
Post #4331 617
В данной задаче рассматривается механизм наследования атрибутов от метаклассов. Код создает два метакласса 𝙼𝟷 и 𝙼𝟸 с атрибутами 𝚊𝚝𝚝𝚛𝟷 (со значениями 𝟷 и 𝟸 соответственно), затем определяет классы 𝙲𝟷 и 𝙲𝟸 с атрибутами 𝚊𝚝𝚝𝚛𝟷 (со значениями 𝟹 и 𝟺 соответственно), где 𝙲𝟸 наследует от 𝙲𝟷 и использует метакласс 𝙼𝟸. Ключевой момент заключается в том, что экземпляры классов НЕ наследуют атрибуты от метаклассов напрямую.

Марк Лутц, «Изучаем 𝙿𝚢𝚝𝚑𝚘𝚗», глава 𝟺𝟶:

«В действительности классы получают атрибуты метаклассов через свои ссылки __𝚌𝚕𝚊𝚜𝚜__ тем же самым способом, каким нормальные экземпляры наследуют их из классов через свои атрибуты __𝚌𝚕𝚊𝚜𝚜__, что имеет смысл, поскольку классы также являются экземплярами метаклассов».

Однако есть важное ограничение:

«Главное отличие состоит в том, что наследование экземпляров не проходит по ссылке __𝚌𝚕𝚊𝚜𝚜__ класса, но имеет ограниченный свой охват словарем __𝚍𝚒𝚌𝚝__ каждого класса в дереве согласно 𝙼𝚁𝙾 – следуя только __𝚋𝚊𝚜𝚎𝚜__ на уровне каждого класса и применяя ссылку __𝚌𝚕𝚊𝚜𝚜__ экземпляра только один раз.»

>>> 𝙸.𝚊𝚝𝚝𝚛𝟷
𝙰𝚝𝚝𝚛𝚒𝚋𝚞𝚝𝚎𝙴𝚛𝚛𝚘𝚛: '𝙲𝟸' 𝚘𝚋𝚓𝚎𝚌𝚝 𝚑𝚊𝚜 𝚗𝚘 𝚊𝚝𝚝𝚛𝚒𝚋𝚞𝚝𝚎 '𝚊𝚝𝚝𝚛𝟷'
# Хотя __𝚌𝚕𝚊𝚜𝚜__ класса нормально не проходит
# ошибку атрибутов: объект 𝙲𝟸 не имеет атрибута 𝚊𝚝𝚝𝚛𝟷»

Это происходит потому, что алгоритм наследования для экземпляров работает следующим образом:

𝟷. Если атрибут ищется в экземпляре, 𝙿𝚢𝚝𝚑𝚘𝚗 выполняет следующие шаги:
а) Выполняется поиск в __𝚍𝚒𝚌𝚝__ экземпляра.
б) Если не найдено, то ищется во всех классах в __𝚖𝚛𝚘__, найденном в __𝚌𝚕𝚊𝚜𝚜__ экземпляра.
в) Если не найдено, то ищется во всех классах в __𝚖𝚛𝚘__, найденном в __𝚌𝚕𝚊𝚜𝚜__ класса.
г) Если не найдено, то ошибка 𝙰𝚝𝚝𝚛𝚒𝚋𝚞𝚝𝚎𝙴𝚛𝚛𝚘𝚛.

В данном случае атрибут 𝚊𝚝𝚝𝚛𝟷 определен в нескольких местах: в метаклассах 𝙼𝟷 (значение 𝟷) и 𝙼𝟸 (значение 𝟸), а также в классах 𝙲𝟷 (значение 𝟹) и 𝙲𝟸 (значение 𝟺). При обращении к 𝙸.𝚊𝚝𝚝𝚛𝟷 𝙿𝚢𝚝𝚑𝚘𝚗 следует алгоритму наследования для экземпляров:

🔘 Сначала ищет в __𝚍𝚒𝚌𝚝__ экземпляра 𝙸 (не найдено)
🔘 Затем ищет в 𝙼𝚁𝙾 класса 𝙲𝟸: ['𝙲𝟸', '𝙲𝟷', '𝚘𝚋𝚓𝚎𝚌𝚝']
🔘 Находит 𝚊𝚝𝚝𝚛𝟷 в классе 𝙲𝟸 со значением 𝟺

Таким образом, код выведет 𝟺, поскольку экземпляр 𝙸 наследует атрибут 𝚊𝚝𝚝𝚛𝟷 от своего класса 𝙲𝟸, а не от метаклассов 𝙼𝟷 или 𝙼𝟸.
  • ❤ 3
  • 🤡 3
  • 👍 1
More from @quiz_python
  1. Sep 23, 2026Развёрнутое пояснение: 1. При входе в блок with вызывается метод __enter__, который печата…
  2. Sep 23, 2026Post #4888
  3. Sep 23, 2026Развёрнутое пояснение: 1. В defaults создаётся словарь, где ключ retry ссылается на вложен…
  4. Sep 23, 2026Post #4886
  5. Sep 22, 2026Развёрнутое пояснение: 1. Вызов build_batch создаёт генератор, но его тело пока не исполня…
  6. Sep 22, 2026Post #4884
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →