元类

    2.尽管类的装饰器通常用来管理或者扩展类实例,但是他们也可以用于管理和扩展类对象本身,也与元类的功能重叠

    3.Python3中,所有用户定义的类都是type类对象的实例,type类是应用最广的元类

    4.class语句的内部机制:在一条class语句的末尾,Python会调用type类的构造函数来创建一个class对象。

    • type类定义了一个.__call__(...)方法。该方法运行type类定义的两个其他方法:
      • .__new__(mclass,classname,superclasses,attributedict)方法,它返回新建的MyClass
      • .__init__(customclass,classname,superclasses,attributedict)方法,
        它初始化新建的MyClass

        customclass:为被创建的类,这里是MyClass
        classname:为被创建的类的类名,这里是'MyClass'
        superclasses:为被创建的类的超类元组
        attributedict:为被创建的类的名字空间字典

    5.所有的类型均由type类创建。要通知Python用一个定制的元类来创建类,可以直接声明一个元类来拦截常规的类创建过程。

    定义元类:(所有元类必须是type的子类)

    • 使用元类声明后,在class语句底部进行创建MyClass类时,改为调用元类MetaClass而不是默认的:
      MyClass=Meta('MyClass,superclasses,attributedict)`
    • 元类MetaClass要实现元类协议:

      • 重载元类的.__new__(Meta,classname,superclasses,attributedict)方法,它返回新建的MyClass

    6.元类有的时候不一定是个真正的类,它也可能是一个函数。任何可调用对象都可以作为一个元类,只需要按照以下的做法:

    • class语句的末尾会调用MetaFactory函数

      函数做元类

    7.事实上元类只用于创建类对象,元类并不产生元类自己的实例。因此元类的名字查找规则有些不同:.__call__.__new__.__init__方法均在类中查找

    • 元类声明由子类继承,即子类的构建也是由父类的元类负责

    • 如果元类是以函数的方式声明,则子类的构建不再继承这个函数式元类

      元类的继承

    • 自定义的类,如果没有显示指定元类,也没有指定父类,则默认使用type作为元类(即常规的类创建机制)