# Filename: using_metaclass.py # metaclass是类的模板,所以必须从`type`类型派生: class ListMetaclass(type): def __new__(cls, name, bases, attrs): attrs['add'] = lambda self, value: self.append(value) print('1.', cls) print('2.', name) print('3.', bases) print('4.', attrs) # 1. <class '__main__.ListMetaclass'> # 2. MyList # 3. (<class 'list'>,) # 4. {'__module__': '__main__', 'add': <function ListMetaclass.__new__.<locals>.<lambda> at 0x00570030>, '__qualname__': 'MyList'} return type.__new__(cls, name, bases, attrs) # __new__()方法接收到的参数依次是: # 1、当前准备创建的类的对象,就像在普通的类方法中的self参数,即ListMetaclass元类,它是type类的对象,仍是类。 # 2、类的名字,调用此元类最终创建出实例的类的名字,此处是Mylist,创建的实例是L。 # 3、类继承的父类集合,调用此元类最终创建出实例的类的父类,Mylist的父类是list。 # 4、类的方法集合,Mylist的方法集合。 # 当我们传入关键字参数metaclass时,魔术就生效了,它指示Python解释器在创建MyList时, # 要通过ListMetaclass.__new__()来创建,在此,我们可以修改类的定义,比如,加上新的 # 方法,然后,返回修改后的定义。 class MyList(list, metaclass=ListMetaclass): pass # 验证: # 测试一下MyList是否可以调用add()方法,普通的list没有add()方法 L = MyList() print(L) L.add(1) print(ListMetaclass) print(MyList) print(L) # 结果: [] <class '__main__.ListMetaclass'> <class '__main__.MyList'> [1]
元类就是用来创建这些类(对象)的,元类就是类的类。type就是Python的内建元类,当然了,你也可以创建自己的元类。
Sign in to make a reply
Eliefly