元类
python中一切皆对象,类本身也是一个对象,python解释器在加载class的时候就会创建一个对象(这里的对象指类,而非类的实例)
1.什么是元类?
元类是类的类,是类的模板
元类是用来控制如何创建类的,正如类是创建对象的模板一样
元类的实例为类,正如类的实例是对象(f1对象是Foo类的一个实例,Foo类是type类的一个实例)
class Foo: def __init__(self): pass f1=Foo() #f1是通过Foo类实例化的对象 print(type(f1)) #<class '__main__.Foo'> print(type(Foo)) #<class 'type'> #另一种方法创建类:新式类默认继承object, ‘ ,’是继承的是个元组形式,可以继承多个父类 def __init__(self): pass FFo=type('FFo',(object,),{'x':1,'__init__':__init__}) print(FFo) #<class '__main__.FFo'>
class Mytype(type): def __init__(self,a,b,c): print('执行元类') print(a,b,c,sep='\n') def __call__(self, *args, **kwargs): print(self,args,kwargs,sep='----') obj=object.__new__(self) #object.__new__(Foo)---》产生Foo的一个对象 self.__init__(obj,*args,**kwargs) return obj class Foo(metaclass=Mytype): #Foo=Mytype(4个参数 Foo,'Foo',(),{})----》触发Mytype的__init__ def __init__(self,name): self.name=name #f1.name=name print(Foo) f1=Foo('alex') #Foo()触发的是类Mytype的__call__方法 print(f1) print(f1.__dict__) #result: # 执行元类 # Foo # () # {'__module__': '__main__', '__qualname__': 'Foo', '__init__': <function Foo.__init__ at 0x02F160C0>} # <class '__main__.Foo'> # <class '__main__.Foo'>----('alex',)----{} # <__main__.Foo object at 0x0133DF30> # {'name': 'alex'}
class Mytype(type): def __init__(self,a,b,c): print('执行元类') def __call__(self, *args, **kwargs): obj=object.__new__(self) #object.__new__(Foo)---》产生Foo的一个对象 self.__init__(obj,*args,**kwargs) return obj class Foo(metaclass=Mytype): #Foo=Mytype(4个参数 Foo,'Foo',(),{})----》触发Mytype的__init__ def __init__(self,name): self.name=name #f1.name=name print(Foo) f1=Foo('alex') #Foo()触发的是类Mytype的__call__方法 print(f1) print(f1.__dict__) #result: # 执行元类 # <class '__main__.Foo'> # <__main__.Foo object at 0x00E7DA70> # {'name': 'alex'}