元类用于创建类,而类用于创建实例
python解释器在遇到类定义的时候,其实是用type()函数动态创建的类类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A:
def test(self):
pass


print(type(A))
print(A.__bases__)
### 输出
<class 'type'>
(<class 'object'>,)
#类似执行了下面的代码
def f(self):
pass
A = type('A',(object,),dict(test=f))

所以类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
9
class 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
9
print(object.__class__)
print(object.__bases__)
print(type.__class__)
print(type.__bases__)
###
<class 'type'>
()
<class 'type'>
(<class 'object'>,)

可以看出来,objecttype的一个对象,type继承于object,所以说,objecttype 的关系很像鸡和蛋的关系,先有object还是先有type没法说,objecttype是共生的关系,必须同时出现的.

下面是一个实现示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class DemoMetaClass(type):
def __new__(cls, name,bases,attrs) -> type:
attrs['true_name'] = 'demo'
return super().__new__(cls, name,bases,attrs)


class A(metaclass=DemoMetaClass):
Atemp = 1
def ttttO(self):
pass
pass

print(dir(A))
print(A.true_name)
###
['Atemp', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'true_name', 'ttttO']
demo

可以看到,动态的往A里面添加了一个true_name的属性