1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
| class Mymeta(type):
def __new__(cls, *args, **kwargs): print('type 调用了 Mymeta 的 new 方法--生成一个空对象,即 People 类') "这里调用的是 type 的 new 方法,传入参数需要注意全部传会 type 元类" return super().__new__(cls, *args, **kwargs)
def __init__(self, class_name, class_bases, class_dic): print('初始化这个对象--- People 类,给 People 类添加额外的功能') super(Mymeta, self).__init__(class_name, class_bases, class_dic) if not class_name.istitle(): raise TypeError('类名%s请修改为首字母大写' % class_name)
if '__doc__' not in class_dic or len(class_dic['__doc__'].strip(' \n')) == 0: raise TypeError('类中必须有文档注释,并且文档注释不能为空')
def __call__(self, *args, **kwargs): """ self---<class '__main__.People'> :param args: (1,) :param kwargs: {'y': 2} :return: 返回最终初始化好的代码 """ print('调用了 Mymeta 的 call 方法') People_obj = self.__new__(self, *args, **kwargs) self.__init__(People_obj, *args, **kwargs) print("给 People 类生成的对象 obj 添加额外的功能") People_obj.__dict__["新增一个属性"] = None return People_obj
class People(metaclass=Mymeta): """People 类的注释"""
def __new__(cls, *args, **kwargs): print('生成 People 类的空对象') print('传入的位置参数', args) print('传入的位置参数', kwargs) "这里要区别于自定义元类的 new 方法,自定义元类调用的是 type 的 new 方法,传入参数是不一样的" return super().__new__(cls)
def __init__(self, x, y=None): print("初始化 People 类的对象") self.x = x self.y = y print("初始化 People 类的对象结束")
obj = People(1, y=2) print('最终的对象字典:', obj.__dict__)
'''
结果输出
type 调用了 Mymeta 的 new 方法--生成一个空对象,即 People 类 初始化这个对象--- People 类,给 People 类添加额外的功能 调用了 Mymeta 的 call 方法 生成 People 类的空对象 传入的位置参数 (1,) 传入的位置参数 {'y': 2} 初始化 People 类的对象 初始化 People 类的对象结束 给 People 类生成的对象 obj 添加额外的功能 最终的对象字典: {'x': 1, 'y': 2, '新增一个属性': None} '''
|