Python—元类,,什么是元类?元类是类


什么是元类?

元类是类的类,是类的模板

元类是用来控制如何创建类的,正如类是创建对象的模板一样,而元类的主要目的是为了控制类的创建行为

元类的实例化的结果为我们用class定义的类,正如类的实例为对象(f1对象是Foo类的一个实例,Foo类是 type 类的一个实例)

type是python的一个内建元类,用来直接控制生成类,python中任何class定义的类其实都是type类实例化的对象

方式一:使用class关键字

class Chinese(object):    country=‘China‘    def __init__(self,name,age):        self.name=name        self.age=age    def talk(self):        print(‘%s is talking‘ %self.name)

方式二:就是手动模拟class创建类的过程):将创建类的步骤拆分开,手动去创建

#准备工作:#创建类主要分为三部分  1 类名  2 类的父类  3 类体#类名class_name=‘Chinese‘#类的父类class_bases=(object,)#类体class_body="""country=‘China‘def __init__(self,name,age):    self.name=name    self.age=agedef talk(self):    print(‘%s is talking‘ %self.name)"""

步骤一(先处理类体->名称空间):类体定义的名字都会存放于类的名称空间中(一个局部的名称空间),我们可以事先定义一个空字典,然后用exec去执行类体的代码(exec产生名称空间的过程与真正的class过程类似,只是后者会将__开头的属性变形),生成类的局部名称空间,即填充字典

class_dic={}exec(class_body,globals(),class_dic)

步骤二:调用元类type(也可以自定义)来产生类Chinense

Foo=type(class_name,class_bases,class_dic) #实例化type得到对象Foo,即我们用class定义的类Fooprint(Foo)print(type(Foo))print(isinstance(Foo,type))‘‘‘<class ‘__main__.Chinese‘><class ‘type‘>True‘‘‘

我们看到,type 接收三个参数:

第 1 个参数是字符串 ‘Foo’,表示类名第 2 个参数是元组 (object, ),表示所有的父类第 3 个参数是字典,这里是一个空字典,表示没有定义属性和方法

补充:若Foo类有继承,即class Foo(Bar):.... 则等同于type(‘Foo‘,(Bar,),{})

Python—元类

评论关闭