python里everything is object,object creation主要涉及到一下几个函数 1. __init__(self,*args,*kgs) 2.__new__(cls,*args,**kgs) 3.__call__(self,*args,**kgs) 首先介绍这三个函数,接着介绍创建class本身这个对象,以及metaclass时这几个函数的具体调用顺序 创建一个类的实例是,调用这个类的__call__方法,在call方法里首先调用了__new__方法创建这个对象,接着调用__init__方法来对这个对象进行初始化 上面就是python里创建一个类的实例的过程 因此,三个函数对象的参数: 1. init的self是这个创建的类的实例 2.new的cls是这个类本身对应的对象 3.call的self也是这个类本身对应的对象,与new的cls是同一个对象 当一个类的metaclass不是type是,发生的函数调用也是如此,只是在metaclass是默认的type时,调用的call方法是type的call,而此时调用的是metaclass的call,我们可以override这个call,在对象已经被初始化了后加入我们的处理函数 例如:
class AttributeInitType(type):
def __call__(self, *args, **kwargs):
""" Create a new instance. """
# First, create the object in the normal default way.
obj = type.__call__(self, *args)
# Additionally, set attributes on the new object.
for name in kwargs:
setattr(obj, name, kwargs[name])
# Return the new object.
return obj
另外需要注意一点的时,当python遇到一个class时便会创建这个class对应的对象,此时会调用metaclass的new和init方法
因此对于metaclass可以在init函数对这个类进行操作,在call方法里对本次创建的实例进行操作