zoukankan      html  css  js  c++  java
  • 元类案例解析

    元类案例

    元类案例

    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
    

    最后

    具体的步骤就是这样的,和打印的结果一样

  • 相关阅读:
    Android中Alarm的机制
    String字符串操作--切割,截取,替换,查找,比较,去空格.....
    时间类(时间戳的各种转换成)
    android 常用时间格式转换代码
    Android时间戳与字符串相互转换
    Android时间对话框TimePickerDialog介绍
    一种基于Qt的可伸缩的全异步C/S架构server实现(一) 综述
    C++ overloading contructor
    特征生成
    Atitit.软件仪表盘(2)--vm子系统--资源占用监測
  • 原文地址:https://www.cnblogs.com/zx125/p/11608852.html
Copyright © 2011-2022 走看看