C扩展Python - official docs - defining new type

python

1. Code & Official_doc: THIS

2. My question. 

#include <Python.h>                                                                                                                          

/*

* 1.PyTypeObject doc, md, 我看了快两天才明白。我是白痴吗?

* 这里定义了一个结构体,也就是定义了一个c的类型,名叫 kevin_KevinType.

* 2. 回忆一下 c中static, THIS, THIS.

*/

staticforward PyTypeObject kevin_KevinType;

// every Python object contains - a refcount and a pointer to a type object.

typedef struct {

PyObject_HEAD

} kevin_KevinObject;

/*

* 返回值类型: PyObject

* 完全是因为, kevin_KevinObject类型 就仅仅是 PyObject

* 如果要是自己定义了一个复杂的类型 kevin_complicatedObject

* 那返回值类型 应该是 kevin_complicatedObject

* 构造函数

*/

static PyObject*

kevin_new_kevin(PyObject *self, PyObject *args) {

// 定义变量(这还要你废话!?哦O.O)

  kevin_KevinObject* kevin;

/*

* 没有存在感。我把它删了。

if(!PyArg_ParseTuple(args, ":new_kevin")) {

return NULL;

}

*/

  // allocates the memory and then initializes the object

kevin = PyObject_New(kevin_KevinObject, &kevin_KevinType);

  // 看,ta强制转换了。原因,不解释。

return (PyObject*)kevin;

}

// 析构

static void

kevin_kevin_dealloc(PyObject* self) {

PyObject_Del(self);

}

// doc doc
// PyObject_HEAD_INIT(a.ctrl+F; b.THIS; )

static PyTypeObject kevin_KevinType = {

PyObject_HEAD_INIT(NULL)

0,

"Kevin",

sizeof(kevin_KevinObject),

0,

kevin_kevin_dealloc, /*tp_dealloc*/

0, /*tp_print*/

0, /*tp_getattr*/

0, /*tp_setattr*/

0, /*tp_compare*/

0, /*tp_repr*/

};

static PyMethodDef kevin_methods[] = {

  {"new_kevin", kevin_new_kevin, METH_VARARGS,

    "Create a new Kevin object."},

  {NULL, NULL, 0, NULL}

};

DL_EXPORT(void)

initkevin(void) {

  kevin_KevinType.ob_type = &PyType_Type;
  // doc

  Py_InitModule("kevin", kevin_methods);

}

执行。注意,命令的输出是否有错,如果是写文件什么的,sudo,以管理员权限执行:

$ python setup.py build

再执行。如果是ubuntu,应该是有权限问题,sudo

$ sudo python setup.py install

玩玩。

>>> # 是Py_InitModule(name, ...), name的影响,,所以module name是kevin

>>> # Py_InitModule:doc

>>> # 与 distutils Extension(name, ...), name影响了的区别呢?
>>> # THIS, 前面那个文档或许解释了两者的区别。
>>> # Py_InitModule(name, ...), name 能控制 module_name。
>>> # 而 distutils Extension(name, ...), name能控制目录结构,也就是 import的结构。
>>> # 两个name名字要相同,否则会:
>>> import kevin
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
SystemError: dynamic module not initialized properly
>>> # 相关文档: Package, buildWithDistutils, class distutils.core.Extension, 详细:distutils
>>> import kevin
>>> kevin.new_kevin()
<Kevin object at 0xb73614d8> 上面的输出kevin,是 static PyTypeObject kevin_KevinType={}的影响

  

以上是 C扩展Python - official docs - defining new type 的全部内容, 来源链接: utcz.com/z/389129.html

回到顶部