Python元类剖析

元类的作用:

动态拦截和修改类的创建

实例是由类创建,类是由元类创建

最典型的应用场景就是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源码进行剖析了)。

你可能感兴趣的:(Python)