У меня возникли проблемы с пониманием того, как метод. new magi c создает классы. Ниже приведен пример API, который я использую, который использует метаклассы для динамического создания объектов из информации в базе данных.
class Metaclass(type):
def __new__(cls, name, bases, dict_):
print(f' cls - {cls}')
print(f' name - {name}')
print(f' bases - {bases}')
return super(Metaclass, cls).__new__(cls, name, bases, dict_)
class MyObject(object, metaclass=Metaclass):
pass
class PrimaryObject(MyObject):
pass
class SecondaryObject(MyObject):
pass
test = PrimaryObject()
Запуск этого кода вызывает создание экземпляра PrimaryObject, который наследуется от MyObject, который, в свою очередь, наследует от метакласса. Затем вызывается новый метод magi c в метаклассе, который повторяет трижды все объекты, наследуемые от метакласса, даже те, которые не были вызваны:
<class '__main__.Metaclass'>
MyObject
(<class 'object'>,)
<class '__main__.Metaclass'>
PrimaryObject
(<class '__main__.MyObject'>,)
<class '__main__.Metaclass'>
SecondaryObject
(<class '__main__.MyObject'>,)
<__main__.PrimaryObject object at 0x000002214A6786D0>
Каков new метод, получающий эти аргументы, так как ему ничего не передается? Они анализируются с объекта, который его вызывает? И если да, то почему и как он перебирает другие объекты, которые наследуются от объекта, но не являются объектами (SecondaryObject)?
Спасибо