zoukankan      html  css  js  c++  java
  • Python中的new style class机制实现

    1.Python中的对象模型
    python中所有东西都是对象

    class对象:表示Python内置的类型和定义的类型
    instance对象(实例对象):表示由class对象创建的实例

    1.1 对象间的关系
    is-kind-of关系:对应于面向对象中的基类与子类之间的关系
    is-instance-of关系:对应于面向对象中类与实例之间的关系

    <class A>表示名为A的class对象
    <instance a>表示名为a的instance对象
    class A 定义了一个名为A的class
    class 对象表示在Python中的实现

    通过对象的__class__属性或Python内置的type方法可以探测一个对象和哪个对象存在is-instance-of关系
    通过对象的__bases__属性可可以探测一个对象和哪个对象存在is-kind-of关系
    通过内置方法issubclass和isinstanceof判断两个对象间是否存在何种关系

    >>> class A(object): //A是类对象
    ... pass
    ...
    >>> a=A() //a是实例对象
    >>> a.__class__ //a是A的实例
    <class '__main__.A'>
    >>> type(a)
    <class '__main__.A'>
    >>> A.__class__ //类对象A是type的实例
    <type 'type'>
    >>> type(A)
    <type 'type'>
    >>> object.__class__ //类对象object是type的实例
    <type 'type'>
    >>> type(object)
    <type 'type'>
    >>> A.__base__ //类对象A的基类是object
    <type 'object'>
    >>> object.__bases__
    ()
    >>> a.__bases__ //a是实例对象,不是类对象
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    AttributeError: 'A' object has no attribute '__bases__'
    >>> isinstance(a,A)
    True
    >>> issubclass(A,object)
    True
    >>>

    <type 'type'>属于Python中的一类特殊的class对象,这种特殊的class对象能够成为其他class对象的type。这种特殊的class对象称为metaclass对象
    >>> object.__class__
    <type 'type'>
    >>> type.__class__
    <type 'type'>
    >>> type.__bases__
    (<type 'object'>,)
    >>> int.__class__
    <type 'type'>
    >>> int.__bases__
    (<type 'object'>,)
    >>> dict.__class__
    <type 'type'>
    >>> dict.__bases__
    (<type 'object'>,)

    任何一个对象都有一个type,可以通过对象的__class__属性获得
    任何一个instance对象的type都是一个class对象,而任何一个class对象的type都是metaclass对象
    任何一个class对象都直接或间接与<type 'object'>对象之间存在is-kind-of关系,包括<type 'type'>

    2 从type对象到class对象
    可调用性(callable)
    只要一个对象对应的class对象中实现了"__call__"操作,也就是说在Python内部的PyTypeObject中,tp_call不为空
    在Python中,所谓"调用",就是执行对象的type所对应的class对象的tp_call操作
    一个对象是否可调用并不是在编译期能确定的,必须是在运行时才能在PyObject_CallFunctionObjArgs中确定
    2.1 处理基类和type信息
    对于指定了tp_base的内置class对象,当然就使用指定的基类,而对于没有指定的tp_base的内置class对象,Python将为其指定一个默认的基类:PyBaseObject_Type
    就是特殊的<type 'object'>
    Python所有class对象都是直接或间接以<type 'object'>作为基类的。
    PyType_Type没有指定基类,它的基类为<type 'object'>

    判断基类是否已经被初始化完成的调试是base->tp_dict是否为NULL,初始化的一部分工作就是对tp_dict进行填充

    2.2 处理基类列表
    Python支持多重继承,每一个Python的class对象都会有一个基类列表

    slot这一部分没有弄明白

    MRO
    Python虚拟机对Python的内置类型对应的PyTypeObject进行了多种复杂的改造工作:
    a.设置type信息、基类及基类列表
    b.填充tp_dict
    c.确定mro列表
    d.基于mro列表从基类继承操作
    e.设置基类的子类列表

    3.用户自定义class
    类的成员函数和一般的函数相同,同样会有这种声明和实现分离的现象

    创建class对象和创建instance对象的不同之处正是在于tp_new不同。创建class对象,Python虚拟机使用的是type_new
    而对于instance对象,Python虚拟机则使用object_new

    这一部分下次再看,有很多看不明白

  • 相关阅读:
    复杂对象创建终结者(Builder Pattern)
    创建型模式特立独行的两位大侠
    工厂模式(Factory)
    MAC 相关
    iOS 地图相关
    iOS字体相关
    App跳转系统设置界面
    Mac 模拟慢速网络
    Thread1:EXC_BAD_ACCESS 错误
    iOS 统计App 的代码总行数
  • 原文地址:https://www.cnblogs.com/moonflow/p/2370377.html
Copyright © 2011-2022 走看看