一、元类介绍
什么是元类呢?一切源自于一句话:python中一切皆为对象。
元类就是用来实例化产生类的类
关系:元类---实例化---->类(People)---实例化---->对象(obj)
让我们先定义一个类,然后逐步分析
class People: def __init__(self,name,age): self.name=name self.age=age def say(self): print('%s:%s' %(self.name,self.name)) print(People.__dict__) # 如何得到对象 # obj=调用类() obj=People('egon',18) print(type(obj)) # 如果说类也是对象 # People=调用类(。。。) # 查看内置的元类: # 1、type是内置的元类 # 2、我们用class关键字定义的所有的类以及内置的类都是由元类type实例化产生 print(type(People)) # <class 'type'> print(type(int)) # <class 'type'>
二、class关键字创造类People的步骤
类有三大特征
1、类名
# 1、类名 class_name="People"
2、类的基类
# 2、类的基类 class_bases=(object,)
3、执行类体代码拿到类的名称空间
# 3、执行类体代码拿到类的名称空间 class_dic={} class_body=""" def __init__(self,name,age): self.name=name self.age=age def say(self): print('%s:%s' %(self.name,self.name)) """
此时会使用一个exec函数来实现类名称空间字典的创建
exec(class_body,{},class_dic) print(class_dic) # {'__init__': <function __init__ at 0x00000223DD72B280>, 'say': <function say at 0x00000223DD72B160>}
exec()补充:
#exec:三个参数 #参数一:包含一系列python代码的字符串 #参数二:全局作用域(字典形式),如果不指定,默认为globals() #参数三:局部作用域(字典形式),如果不指定,默认为locals() #可以把exec命令的执行当成是一个函数的执行,会将执行期间产生的名字存放于局部名称空间中 g={ 'x':1, 'y':2 } l={} exec(''' global x,z x=100 z=200 m=300 ''',g,l) print(g) #{'x': 100, 'y': 2,'z':200,......} print(l) #{'m': 300}
4、调用元类
People=type(class_name,class_bases,class_dic)