• metaclass


    • 用metaclass来指定类C的元类是MyType
    class MyType:
        def __init__(cls, *args, **kwargs):
            print('here!')
    
    #由于metaclass=MyType,所以执行到这一步的时候,会调用MyType的构造函数
    class C(metaclass=MyType):
        def __init__(self):
            pass
    
    • 对象后面跟(),是要执行类中的call方法。
    • 类C是一个对象,是元类MyType创建了它。遇到C()是要调用MyType的call
    • obj是一个对象,是类C创建了它。遇到obj()是要调用C的call
    以下代码调用方法的顺序,按照数字顺序先后执行
    class MyType(type):
        def __init__(cls, *args, **kwargs):
            super(MyType, cls).__init__(*args, **kwargs)
    
        def __call__(cls, *args, **kwargs):
         #3.调用C类的__new__方法
            obj = cls.__new__(cls, *args, **kwargs)
         #4.调用C类的__init__方法
            cls.__init__(cls)
    
    #1.执行到class C(metaclass=MyType)的时候,调用MyType的__init__方法
    class C(metaclass=MyType):
        def __init__(self):
            pass
    
        def __new__(cls, *args, **kwargs):
            return object.__new__(cls, *args, **kwargs)
    
    #2.执行到C()的时候,调用MyType的__call__方法
    obj = C()
    
  • 相关阅读:
    C语言学习第八章
    C语言学习第七章
    C语言学习第六章
    C语言学习第五章
    ssh的bug
    Oracel 用户管理
    初识Kettle
    IDEA使用MAVEN时自动创建骨架卡的设置
    2017/6/12 JSON
    DDL,DML,DQL
  • 原文地址:https://www.cnblogs.com/dongmengze/p/9523008.html
Copyright © 2020-2023  润新知