测试环境Python3.7.1参考链接两句话轻松掌握Python最难的知识点——元类Python进阶:一步步理解Python中的元类metaclass什么是元类?1__new__()方法和__init__()方法的区别1.1__new__()方法需要有返回值,而__init__()不需要返回值。结果,init()返回一个None,没有手动return__new__()方法需要有返回值2__new__()方法在类和元类类中的用法区别classSingle(object):_instance=Nonedef__new__(cls,*args,**kw):如果cls._instance为None:cls._instance=object.__new__(cls,*args,**kw)返回cls。_instancedef__init__(self):passsingle1=Single()single2=Single()print(id(single1)==id(single2))classSpider:i=0def__new__(cls,*args,**kwargs):打印('cls.i>',cls.i)cls.i+=1returnsuper().__new__(cls,*args,**kwargs)def__init__(self):print('self.i>',self.i)Spider()Spider()Spider()输出如下Truecls.i>0self.i>1cls.i>1self.i>2cls.i>2self.i>3在普通类中使用new的第一个参数是cls,init的第一个参数是selfcls的意思当前类self表示当前实例2.2在元类中使用__new__()方法元类有如下定义方法classChattyType(type):def__new__(cls,name,bases,dct):print("Allocatingmemoryforclass",name)returntype.__new__(cls,name,bases,dct)def__init__(cls,name,bases,dct):print("Init'ing(configuring)class",name)super(ChattyType,cls)。__init__(name,bases,dct)print(type(ChattyType))ins=ChattyType("duck",(object,),dict())print(type(ins))输出如下
