python-抽象-metaclass
元类用于创建类,而类用于创建实例
python解释器在遇到类定义的时候,其实是用type()函数动态创建的类类型
1 | class A: |
所以类A其实也是一个对象,继承于object,而且是type的一个对象(type也是一个类哦!)
metaclass(元类)又是什么呢,上面A = type('A',(object,),dict(test=f))使用type来创建的类,那么如果我声明一个类去继承type,是不是可以A = mytype('A',(object,),dict(test=f))来创建类呢,bingo,其实就是这样.
1
2
3
4
5
6
7
8
9class AMetaclass(type):#一般元类以Metaclass结尾
pass
A = AMetaclass('A',(object,),dict())
print(type(A))
print(A.__bases__)
### 输出
<class '__main__.AMetaclass'>
(<class 'object'>,)
可以看到,A变成了AMetaclass的一个对象
那么type又是一个什么呢,和object又是什么关系?
1
2
3
4
5
6
7
8
9print(object.__class__)
print(object.__bases__)
print(type.__class__)
print(type.__bases__)
###
<class 'type'>
()
<class 'type'>
(<class 'object'>,)
可以看出来,object是type的一个对象,type继承于object,所以说,object 和 type 的关系很像鸡和蛋的关系,先有object还是先有type没法说,object和type是共生的关系,必须同时出现的.
下面是一个实现示例
1 | class DemoMetaClass(type): |
可以看到,动态的往A里面添加了一个true_name的属性