元类案例解析
元类案例
元类案例
class Mytype(type):
print("Mytype")
def __new__(cls, *args, **kwargs):
print("Mytye_new")
return type.__new__(cls,*args, **kwargs)
class Model(metaclass=Mytype):
print("Model")
def __new__(cls, *args, **kwargs):
print("Model_new")
x=1
class zx(Model):
print("zx")
def __new__(cls, *args, **kwargs):
print("zx_new")
z=zx("s","sa")
Mytype
Model
Mytye_new
zx
Mytye_new
zx_new
案例解析
首先查看,运行结果,是不是和你想的完全不一样,还有为啥Mytype的__new__
执行了两次?
首先代码是自上向下执行的
首先写出代码的执行顺序,不考虑元类细节
##具体参数不详细填写
##主要分为以下7步骤
1 Mytype=type()
2 Model=Mytype()
3 zx=Mytype()
4 z=zx()
详细分步解析
1 Mytype=type()
1.执行Mytype=type(),会首先运行一下类的内容,`print("Mytype")`执行了
2.元类是type,首先调用type as type2元类的`__call__()`
3.type2的`__call__()`会调用type的`__new__()和__call__()`方法
4.成功创建了Mytype对象
打印信息
Mytype
2 Model=Mytype()
1.执行Model=Mytype(),会首先运行一下类的内容,`print("Model")`执行了
2.元类是Mytype,首先调用type元类的`__call__()`
3.type的`__call__()`会调用Mytype的`__new__()和__call__()`方法,`__new__()`里的` print("Mytye_new")`执行了
4.成功创建了Model对象
打印信息
Model
Mytye_new
3 zx=Mytype()
这里需要注意一点,zx的父类是Model,Model的元类是Mytype,所以zx的元类也就是Mytype,元类是可以被继承的,所以会执行zx=Mytype()
1.执行zx=Mytype(),会首先运行一下类的内容,`print("zx")`执行了
2.元类是Mytype,首先调用type元类的`__call__()`
3.type的`__call__()`会调用Mytype的`__new__()和__call__()`方法,`__new__()`里的` print("Mytye_new")`执行了
4.成功创建了zx对象
打印信息
zx
Mytye_new
4 z=zx()
1.执行z=zx(),会首先运行一下类的内容,`print("zx_new")`执行了
2.元类是zx,首先调用zx元类的Mytype的`__call__()`,但是没有继续调用type的`__call__()`方法
3.type的`__call__()`会调用zx的`__new__()和__call__()`方法,`__new__()`里的` print("zx_new")`执行了
4.成功创建了zx对象
打印信息
zx_new
最后
具体的步骤就是这样的,和打印的结果一样