三、对象到底如何创建

来源:互联网 发布:windows moviemaker 编辑:程序博客网 时间:2024/06/07 23:49

一、二 文中知道,无论PyObject还是PyXXXObject,都包含有那么几样东西。

具体举个例子来说,PyIntObject里面有三东西:

int ob_refcnt;//引用计数
struct _typeobject *ob_type; //一堆信息
long ob_ival; //值

只要把这三个要素构成了,不就生成一个基本的"int"了??是不是??

故在intobject.c中有如下代码出现。PyTypeObject就是_typeobject。

PyTypeObject PyInt_Type = {    PyVarObject_HEAD_INIT(&PyType_Type, 0)    "int",    sizeof(PyIntObject),    0,    (destructor)int_dealloc,                    /* tp_dealloc */    (printfunc)int_print,                       /* tp_print */    0,                                          /* tp_getattr */    0,                                          /* tp_setattr */    (cmpfunc)int_compare,                       /* tp_compare */    (reprfunc)int_to_decimal_string,            /* tp_repr */    &int_as_number,                             /* tp_as_number */    0,                                          /* tp_as_sequence */    0,                                          /* tp_as_mapping */    (hashfunc)int_hash,                         /* tp_hash */    0,                                          /* tp_call */    (reprfunc)int_to_decimal_string,            /* tp_str */    PyObject_GenericGetAttr,                    /* tp_getattro */    0,                                          /* tp_setattro */    0,                                          /* tp_as_buffer */    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |        Py_TPFLAGS_BASETYPE | Py_TPFLAGS_INT_SUBCLASS,          /* tp_flags */    int_doc,                                    /* tp_doc */    0,                                          /* tp_traverse */    0,                                          /* tp_clear */    0,                                          /* tp_richcompare */    0,                                          /* tp_weaklistoffset */    0,                                          /* tp_iter */    0,                                          /* tp_iternext */    int_methods,                                /* tp_methods */    0,                                          /* tp_members */    int_getset,                                 /* tp_getset */    0,                                          /* tp_base */    0,                                          /* tp_dict */    0,                                          /* tp_descr_get */    0,                                          /* tp_descr_set */    0,                                          /* tp_dictoffset */    0,                                          /* tp_init */    0,                                          /* tp_alloc */    int_new,                                    /* tp_new */    (freefunc)int_free,                         /* tp_free */};

总结:在XXXobject.c中,通过声明定义变量PyXXX_Type(PyTypeObject类型的)创建了一个XXX对象。

创建过程会调用一系列函数,具体过程是:tp_new(C++中的new),设置sizeof(PyIntObject),tp_init(视为类的构造函数)

原创粉丝点击