什么是元类(metaclass)

1、先理解Python的对象模型

1
2
class Person
pass

Person是一个类,实际上,python认为类也是对象

1
2
3
class Person
pass
printtype(Person))

输出:

1
<class 'type'>

Person这个类,也是由type创建出来的对象。

实例<–类<–元类

1
2
3
4
class Person
pass

p = Person()

关系如下:

1
2
3
4
5
6
7
p
|
V
Person
|
V
type

也就是说:

p是Person的实例;

Person是type的实例;

验证:

1
2
printisinstance(p,Person)) #True
print(isinstance(Person,type)) #True

type是什么

type()不只是查看类型,还第二个作用:动态创建类

普通写法:

1
2
3
4
class Person
age = 18
def hello(self):
print(”Hello“)

完全等价于:

1
2
3
4
5
6
7
8
9
10
11
def Hello(self):
print(”Hello“)

Person = type
'Person',
(),
{
"age" : 18,
"Hello" : "Hello"
}

type (

类名

父类

属性字典

)

所以:type就是Python的默认的元类。

元类有什么用

最常见:自动修改类

1
2
3
4
class MyMetatype):
def __new__(cls,name,bases,attrs):
attrs["Version"] = "1.0"
return super().__new__(cls,name,bases,attrs)

以后:

1
2
class Person(metaclass = MyMeta):
pass

自动拥有:

1
print(Person.Version)

输出:

1
1.0

什么时候会调用元类

1
2
3
4
5
class MyMetatype):
def __new__(cls,name,bases,attrs):
print("创建类")

return super().__new__(cls,name,bases,attrs)

使用:

1
2
class Person(metaclass = MyMeta):
pass

输出:

1
创建类

注意:这里只输出一次,因为元类只在:class Person执行时运行。

以后Person()不会再调用元类。