Python 类、元类小实验

作者: treelake | 来源:发表于2016-11-20 13:53 被阅读396次

    理解python的类实例化
    class type(name, bases, dict)官方定义
    object.__new__(cls[, ...])官方定义
    Customizing class creation 定制类创建 官方文档
    Built-in Types 内建类型 官方文档

    准备知识

    • 当一个类定义被执行,发生了这些事:
      • 一个合适的元类被确定
      • 类命名空间被准备好
      • 类主体被执行
      • 类对象被创建
    • 类中定义的__new__(cls[, ...])方法用来创建类cls的一个新实例,它是特殊的不用声明的静态方法。
    • 类中对__call__方法的定义意味着对该类的实例的括号运算符的重载。
    • type(x)返回x的类型。类是元类的实例(Python中一切皆对象,类也是对象,对象是类的实例,只不过类的类是特殊的元类),所以int的类是type(元类)。表示构造关系。整型1由int类构造,int类由元类构造。(类名+括号运算符调用类的构造函数,类定义的过程即是元类实例化的过程,元类中实现了构造类的规则)。
    a = 1
    type(a)
    # int
    type(int)
    # type
    
    • x.__mro__返回类x的所有超类(父类)(包括x自身)(MRO-方法解析顺序),表示类之间的继承关系,int继承object。继承关系和构造关系是两回事。
    int.__mro__
    # (int, object)
    

    实验


    理解

    • MyType继承type并重载type中的方法,是我们自定义的元类。指定类MyTypeInstance的元类为MyType意味着用MyType来构建类MyTypeInstanceMyType中重载的__new____init__方法影响类MyTypeInstance的定义过程。__new__可以控制类名与类属性的审查,__init__可以增加或修改类的属性。而MyType__call__方法则控制类MyTypeInstance的实例化过程。

    • MyType元类默认是type(与继承type无关),即MyTypetype的实例,亦即MyType = type(name, bases, dict)MyType的定义过程(即type类的实例化过程)调用的是type__call__方法。
      __new__是静态方法,__call____init__是实例方法。实际上isinstance(type, type)得到True,即typetype的实例,type调用__call__方法也就说得通了,也就是type实例+()运算符 等于 type实例调用了它的类type中定义的__call__实例方法。在__call__方法中先调用__new__静态方法来产生一个python对象,然后调用type实例的__init__方法修改新对象的属性。

    相关文章

      网友评论

      本文标题:Python 类、元类小实验

      本文链接:https://www.haomeiwen.com/subject/eozspttx.html