元类的作用:
动态拦截和修改类的创建
实例是由类创建,类是由元类创建
最典型的应用场景就是ORM(对象 关系 映射)
type本身就是元类的实现
Python3.+定义自己的元类:
class HelloMeta(type):
def __init__(cls, name, bases, attrs):
super(HelloMeta, cls).__init__(name, bases, attrs)
print("attrs >> ", attrs)
attrs_ = {}
for k, v in attrs.items():
if not k.startswith("__"):
attrs_[k] = v
setattr(cls, "_new_dict", attrs_)
class NewHello(metaclass=HelloMeta):
a = 1
b = True
print(NewHello._new_dict)
h2 = NewHello()
print(h2._new_dict)
输出:
attrs >> {'__module__': '__main__', '__qualname__': 'NewHello', 'a': 1, 'b': True}
{'a': 1, 'b': True}
{'a': 1, 'b': True}
解析:
一般用于动态映射场景,最典型的就是ORM(初始化 类时的自定义数据结构或处理)
小结:
自定义的元类会在普通类通过metaclass指定后,在class声明加载时会自动实例自定义元类,该自定义元类能拦截到namespace中的所有数据,并可以对其进行操作。并且自定义的元类与使用类不存在继承关系,所以再mro中不会记录其信息。
自定义元类必须继承type类,Linux中一切皆文件,Python中一切源于type。(有人会想到object,这类似鸡和蛋的关系了,就留到后面对c源码进行剖析了)。