# 调用元类产生类会发生的三件事:(与调用类产生对象的步骤一致)
# 1、先生成一个空对象(调用__new__方法生成的对象)
# 2、调用元类下的__init__方法,完成初始化对象的操作
# 3、返回一个初始化好的对象
__new__方法是在__init__之前就被调用的,__new__方法默认是生成带有当前类的基本属性的对象:
def __new__(cls, *args, **kwargs):
return type.__new__(cls, *args, **kwargs)
只有通过__new__方法生成了对象后,才会进一步调用__init__方法。因为__init__方法需要以self参数(也就是一个对象)。
验证如下:
class Mymeta(type):
def __init__(self, class_name, class_bases, class_dic):
print("init方法")
def __new__(cls, *args, **kwargs):
print("new方法")
print(cls)
print(args)
print(kwargs)
class Test(metaclass=Mymeta):
pass
# 输出结果:
# new方法
# <class '__main__.Mymeta'>
# ('Test', (), {'__module__': '__main__', '__qualname__': 'Test'})
# {}
因为__new__方法并没有返回一个对象,所以无法继续调用__init__方法,也就无法通过该类(元类)产生一个对象(类),此时通过Test实例化会报错 : TypeError: 'NoneType' object is not callable
将__new__方法改写:
def __new__(cls, *args, **kwargs):
print("new方法")
return type.__new__(cls, *args, **kwargs)
# 此时输出:
# new方法
# init方法