zoukankan      html  css  js  c++  java
  • 关于元类的一些使用心得

    作廖老师的Python实战作业时,对元类这个魔法方法有些小心得。

    元类这个黑魔法和linux中root都是bug般的存在,不想纠缠概念性东西,试着从Python解释器的角度分析下元类的执行过程。

    其实,元类的主要作用尽在这三句话中:

    1.拦截类的创建

    2.修改类

    3.返回修改后的类

    普通类调用__new__方法产生实例对象,而元类通过type.__new__创建新的类。

    1 class ModelMetaclass(type):
    2     #采集应用元类的子类属性信息
    3     #将采集的信息作为参数传入__new__方法
    4     #应用__new__方法修改类
    5 def __new__(cls,name,bases,attrs):
    6      ...
    7      return type.__new__(cls,name,bases,attrs)
    1 class Model(dict,metaclass=ModelMetaclass):
    2      ...

    我们定义一个元类ModelMetaclass和一个应用元类的Model类。

    1 model = Model(**kw)

    当我们用Model类创建一个model实例对象,python解释器执行过程如下:

    1.发现元类

    2.应用元类。通过元类的__new__创建类对象,__new__方法首先从Model类的类定义中搜集属性和方法信息作为字典数据传入__new__的attrs参数中;用户对收集的信息删减增添修改,生成新的attrs参数;调用type.__new__方法,并把新的attrs参数传入该方法中,即返回一个新的类对象。

    3.如果存在__init__方法,在第二步即生成类对象后调用__init__方法初始化类对象

    当元类存在时,并不是直接根据类的描述创建实例对象,而是拦截类的实例化。然后根据元类动态修改类的描述,最后根据修改后的类描述来创建对象。

  • 相关阅读:
    修改浏览器滚动条样式
    js实现无缝轮播
    JS (canvas) 两个小球碰撞
    js里div随着鼠标一起移动
    js的动态加载、缓存、更新以及复用
    js阻止事件冒泡的两种方法
    核心DOM和html DOM的区别
    JavaScript 事件流、事件处理程序及事件对象总结
    css3 实现飞入由小变大
    简单手写js轮播
  • 原文地址:https://www.cnblogs.com/weixia-blog/p/7339833.html
Copyright © 2011-2022 走看看