# 1.类名
class_name='Human'
# 2.基类
class_bases=(object,)
# 3.定义阶段执行类子代码,执行类子代码,就会生成类的名称空间,然后丢进类里面
class_dic={}
class_body='''
def __init__(self,name,age):
self.name=name
self.age=age
def info(self):
print('name',self.name,'age',self.age)
'''
exec(class_body,{},class_dic)
print(class_dic)
# 4.调用元类
a=type(class_name,class_bases,class_dic)
print(a) # 输出<class '__main__.Human'>
简单来说就是用exec()函数来执行代码块,生成类的名称空间,并将其添加到类字典class_dic中,key就是函数名,value就是函数内存地址; 然后调用元类,将类名,类的基类,类的名称传入type,就会生成类,这里我们没有用class关键字,也造了一个类,说明class关键字的底层,python也做了上述代码1234步骤的操作. 补充 -> exec() 函数的用法:exec(source, globals=None, locals=None),source参数表示要执行的 Python 代码,例如字符串里写上代码块。globals 和 locals 参数表示全局和局部作用域,在执行source里的代码时会将这些作用域绑定到代码中,全局的传入全局空字典,局部的传入局部空字典。
# 1.类名
class_name='Human'
# 2.基类
class_bases=(object,)
# 3.定义阶段执行类子代码,执行类子代码,就会生成类的名称空间,然后丢进类里面
class_dic={}
class_body='''
name='王炸'
age=18
'''
exec(class_body,{},class_dic)
print(class_dic) # 输出{'name': '王炸', 'age': 18}
上述代码,在source代码块中定义了两个变量name和age,它们会丢入局部名称空间,输出的时候key就是变量名,value就是变量的内存地址,因为字符串类和整型类是内置类,其__str__()重写过会直接输出字符串,而不是输出内存地址.