class Mymeta(type):
def __new__(cls, name, bases, dct):
print(f'Mymeta.__new__: cls={cls}, id(cls)={id(cls)}')
return super().__new__(cls, name, bases, dct)
def __init__(cls, name, bases, dct):
print(f'Mymeta.__init__: cls={cls}, id(cls)={id(cls)}')
super().__init__(name, bases, dct)
type元类机制会调用__call__方法,执行__new__,再执行__init__
1. Python 元类机制的工作流程
在元类的上下文中,__new__ 和 __init__ 的调用顺序和逻辑如下:
1. 调用 __new__:
• __new__ 的任务是 创建类对象。
• 此时,name、bases 和 dct 描述的是类的定义信息。
• 返回值是类对象(如 MyClass)。
2. 调用 __init__:
• __init__ 的任务是对 __new__ 创建的类对象进行 初始化。
• 此时,name、bases 和 dct 仍然是类的定义信息。
虽然 __new__ 和 __init__ 的参数(name, bases, dct)看起来是相同的,但它们在调用时所操作的 cls 对象不同:
• 在 __new__ 中,cls 是元类本身(如 Mymeta),因为 __new__ 是由元类调用,用于创建类对象。
• 在 __init__ 中,cls 是刚刚通过 __new__ 创建的类对象(如 MyClass),因为 __init__ 的任务是初始化这个类对象。
cls 的值不同是关键
• 在 __new__ 中:
• cls 是元类 Mymeta,因为它负责 创建类对象。
• 在 __init__ 中:
• cls 是通过 Mymeta.__new__ 创建出来的类对象(如 MyClass)。
• __init__ 的任务是初始化 MyClass。
标签:__,调用,Python,元类,init,bases,new,dct,cls
From: https://www.cnblogs.com/hayaso/p/18579789