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()
原文地址:https://www.cnblogs.com/dongmengze/p/9523008.html