Python3基础-元类
1、引子
class Foo: pass #所有的对象都是实例化或者说调用类而得到的(调用类的过程称为类的实例化) f1 = Foo() #f1是通过Foo类实例化的对象 print(type(f1)) #输出:<class '__main__.Foo'> 表示,obj对象由Foo类创建
python中一切皆是对象
类本身也是一个对象,当使用关键字class的时候,python解释器在加载class的时候就会创建一个对象(这里的对象指的是类而非类的实例)
print(type(Foo)) #输出<class 'type'> 证明了是调用type这个元类而产生的Foo,即是默认的元类为type
2、元类
元类是类的类,是类的模板
元类是用来控制如何创建类的,正如类是创建对象的模板一样
元类的实例为类,正如类的实例为对象(f1 对象是Foo类的一个实例,Foo类是type类的一个实例)
注意:type是python的一个内建元素,用来控制生成类,python中任何class 定义的类都是type类实例化的对象
语法:想要生成的类名 = type(想要生成的类名,(继承的类默认objec,),属性字典{'x':1})。 注意:type中有三个参数,第一个参数是想要生成的类名为字符串类型;第二个参数是继承的类默认为obje为元组类型;第三个参数为生成的类的属性字典为字典类型。
#元类的创建方法 def __init__(self,name,age): self.name = name self.age = age def test(self,val): self.name = val return self.name test = type('test',(object,),{'x':1,'__init__':__init__,'test':test}) print(test) print(test.__dict__) t1 = test('花花',30) print(t1.x) print(t1.age) print(t1.test('小花'))
3、MetaClass作为创建类的类,,可以通过定义__new__和__init__来分别创建类对象和初始化(修改)类的属性
一个类没有声明自己的元类,默认他的元类就是type,除了使用内置元类type,我们也可以通过继承type来自定义元类,然后使用metaclass关键字参数为一个类指定元类。
#自定义元类 class Mytype(type): def __init__(self,a,b,c): print('元类的析构函数执行') print(self) def __call__(self, *args, **kwargs): print('self====',self) print(args,kwargs) # self是Meta_Type的实例,也就是Foo # 因为每个类都默认继承object,所以可以调用__new__(Foo)方法,来实例化一个对象f1 == object.__new__(Foo) ==> f1 obj = object.__new__(self) #object.__new__(Foo) print(obj) # 调用Foo的构造函数实例化对象 == Foo.__init__(f1,*args,**kwargs) self.__init__(obj,*args,**kwargs) #Foo.__init__() return obj class Foo(metaclass=Mytype): #Foo = Mytype(Foo,'Foo',(),{}) def __init__(self,name): self.name = name #f1.name = name #print(Foo) # #当Foo()时,表示执行了Foo,则会调用元类的__call__,__call__中会生成对象f1,并且调用Foo下的__init__方法,最终完成实例化 f1= Foo('susu') print(f1.__dict__) # print(f1)