元类是类的类,使我们自定义的类,即我们用class定义类本质就是元类,是类的模板
四步走:
一:控制class定义类的过程
1.先拿到类名
2.在拿到基类
3.执行类体代码,得到名称空间的dict
4.调用元类将三个参数传递进去
#其实class 是上面四步的封装。(隔离了复杂度)
二:自定义元类
class Mymeta(type):
def __init__(self,class_name,class_base,class_dic):
super().__init__(class_name,class_base,class_dic)
class My(object,metaclass=Mymeta):
pass
三:控制类与对象的产生
class Bar: def __call__(self, *args, **kwargs): print(self) print(args) print(kwargs) bar = Bar()bar('test')#对象后面加括号触发
class Mymeta(type): def __init__(self, class_name, class_base, class_dic): ''' :param class_name: 类名 :param class_base: 基类 :param class_dic: 名称空间 ''' if not class_name.istitle(): raise ValueError('类名需要大小写') if class_dic.get('__doc__'): content = class_dic.get('__doc__') content = content.replace(' ', '') content = content.replace('\n', '') if len(content)==0: raise ValueError('类不能没有注释') if '__doc__' not in class_dic or not clas_dic.get('__doc__').strip(): raise TypeError('必须为类指定文档注释') super(Mymeta, self).__new__(class_name, class_name, class_dic) class Mysql: ''' ''' def __init__(self, Host, Port): self.Host = Host self.Port = Port
#创建类的两种方式
方式一:、
使用class关键字
class People(object):
def talk(self):
print('你好')
def walk(self):
print('走路')
方式二:
手动模拟class创建类的过程:将创建类的步骤拆分来,手动去创建、
手动创建需要三个条件,
需要分别拿到
1.类名
2.类的父类
3.类体(执行后得到名称空间的dict)
class_name=People
class_base=object
class_body= ''' #类体
def talk(self):
print('你好')
def walk(self):
print('走路')
'''
cla=2wss_dic={}
步骤一(先处理类体->名称空间):类体定义的名字都会存放于类的名称空间中(一个局部的名称空间),我们可以事先定义一个空字典,然后用exec去执行类体代码
(exec产生名称空间的过程与真正的class过程类似,只是后者会将_开头的属性变形,生成类的局部名称空间,即填充字典)
exec(class_body,globals,class_dic)
步骤二:
People=type(class_name,class_base,class_dic)
#实例化type得到对象Foo,即我们得到对象People,即我们用class定义的类People
一个没有显示的声明自己的元类,默认继承的就是type
88