首先元类中的__new__被调用
所有使用该元类的类都会调用一次,不管其有没有初始化,所以元类__new__的作用是修改/验证类的定义
返回的是一个元类的实例,即一个类的定义
元类的__init__由其__new__调用
接着元类的__call__被调用,要返回一个类的实例
元类__call__中要调用类的__new__和__init__
def __call__(cls, *args, **kwargs):
print("calling Meta's __call__", cls)
i = cls.__new__(cls)
i.__init__(*args, **kwargs)
return i
当然,也可以处理完逻辑之后, return super().__call__(*args, **kwargs)
--------------------------------------------------------------------------------------------------
__new__ 是类方法
__init__ 和 __call__ 是实例方法,只能由类的实例(对象)来调用
因此在类实例化过程中 a = A(), 类是可调用的函数,调用的是元类中的__call__函数, 因为类是元类的实例