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源码进行剖析了)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值