美文网首页技术干货
python面向对象(一)从C语言开始

python面向对象(一)从C语言开始

作者: 唔六 | 来源:发表于2020-02-28 22:08 被阅读0次

    一切皆为对象。在java中对象是数据和方法的结合,而python中关于对象的定义是:

    凡能当作参数传递,就是对象

    Python 对象的实现

    由于大部分人使用的是Cpython编译好的Python程序, 在Cpython中是这样实现对象的:

    typedef struct _object {
      struct _object *_ob_next;
      struct _obeect *_ob_prev;
      Py_ssize_t ob_refcnt;
      struct _typeobject *ob_type;
    }PyObject_VAR_HEAD, PyObject_HEAD
    

    凡是使用了_object 就是对象

    一个简单的链表结构,加上引用计数refcnt和类型ob_type就是一个对象的全部。
    在python中,定义了int list dict string等基本对象,全都是_object的改写。以int类型为例子:

    typedef struct {
    // PyObject_HEAD 是 _object的简写
      PyObject_HEAD
      long ob_ival;
    } PyIntObject
    

    所以,可以简单的讲: 一切基本对象无非是在_object中增加了某些参数。

    Python对象中的_typeobject

    在看对象的定义,其中有一个_typeobject实现如下:

    typedef struct _typeobject {
        PyObject_VAR_HEAD
        const char *tp_name; /* For printing, in format "<module>.<name>" */
        Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */
    
        /* Methods to implement standard operations */
    
        destructor tp_dealloc;
        printfunc tp_print;
        getattrfunc tp_getattr;
        setattrfunc tp_setattr;
        cmpfunc tp_compare;
        reprfunc tp_repr;
    
        /* Method suites for standard classes */
    
        PyNumberMethods *tp_as_number;
        PySequenceMethods *tp_as_sequence;
        PyMappingMethods *tp_as_mapping;
    
        /* More standard operations (here for binary compatibility) */
    
        hashfunc tp_hash;
        ternaryfunc tp_call;
        reprfunc tp_str;
        getattrofunc tp_getattro;
        setattrofunc tp_setattro;
    
        /* Functions to access object as input/output buffer */
        PyBufferProcs *tp_as_buffer;
    
        /* Flags to define presence of optional/expanded features */
        long tp_flags;
    
        const char *tp_doc; /* Documentation string */
    
        /* Assigned meaning in release 2.0 */
        /* call function for all accessible objects */
        traverseproc tp_traverse;
    
        /* delete references to contained objects */
        inquiry tp_clear;
    
        /* Assigned meaning in release 2.1 */
        /* rich comparisons */
        richcmpfunc tp_richcompare;
    
        /* weak reference enabler */
        Py_ssize_t tp_weaklistoffset;
    
        /* Added in release 2.2 */
        /* Iterators */
        getiterfunc tp_iter;
        iternextfunc tp_iternext;
    
        /* Attribute descriptor and subclassing stuff */
        struct PyMethodDef *tp_methods;
        struct PyMemberDef *tp_members;
        struct PyGetSetDef *tp_getset;
        struct _typeobject *tp_base;
          ..
     }
    

    也就是说: _object的结构体中引入了 _typeobject_typeobject 又指向了_object。这就是一个循环指针。
    可以看到_object通过指向_typeobject获取了大量的属性。他们包括:

    • python的基本方法
    • hash操作
    • 类型及相关方法

    简单的讲 ,_object中指向的_typeobject中如果tp_call有值, 那么这个_object就具备函数的特性,如果tp_as_number有值,那么就具备number类的所有属性和方法。因此,当你在C语言层面为某个_typeobject所有的属性都设置一个有效值,那么,你就可以说:

    这个对象即是数字,也是字符串;是函数,也是类; 是一个list,也是一个dict。

    哪些不是对象

    那些不能当作python参数进行传递的,例如语法解析(AST)过程中定义的关键词. 例如:
    yield for = is or and等等

    这些作为语法解析存在的,并不实际与_object打交道,只是一个通往_object的桥梁。因此不能视为对象。

    并非所有语言都是这样的实现方法。java将类和对象 函数等进行了严格区分,在C语言上并没有一个通用的_object存在

    相关文章

      网友评论

        本文标题:python面向对象(一)从C语言开始

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