Створення об’єкта класу

Оновлено: 28.04.2023

Коли простір імен класу заповнено виконанням тіла класу, об’єкт класу створюється шляхом виклику metaclass(name, bases, namespace, **kwds) (додаткові ключові слова, передані тут, такі самі, як ті, що передані` __prepare__`).

Цей об’єкт класу є тим, на який посилатиметься форма super() з нульовим аргументом. __class__ — це неявне посилання на закриття, створене компілятором, якщо будь-які методи в тілі класу посилаються на __class__ або super. Це дозволяє формі нульового аргументу super() правильно ідентифікувати клас, який визначається на основі лексичного визначення, тоді як клас або екземпляр, який використовувався для здійснення поточного виклику, ідентифікується на основі першого аргументу, переданого методу.

При використанні метакласу за замовчуванням type або будь-якого метакласу, який остаточно викликає type.__new__, наступні додаткові кроки налаштування викликаються після створення об’єкта класу:

Метод type.__new__ збирає всі атрибути в просторі імен класу, які визначають метод __set_name__(); Ці методи __set_name__ викликаються з визначеним класом і присвоєною назвою цього конкретного атрибута; Хук __init_subclass__() викликається на безпосередньому батькові нового класу в порядку вирішення методів.

Після того, як об’єкт класу створено, він передається до декораторів класу, включених у визначення класу (якщо такі є), і отриманий об’єкт зв’язується в локальному просторі імен як визначений клас.

Коли новий клас створюється за допомогою type.__new__, об’єкт, наданий як параметр простору імен, копіюється до нового впорядкованого відображення, а вихідний об’єкт відкидається. Нову копію загортають у проксі-сервер лише для читання, який стає атрибутом __dict__ об’єкта класу.