C扩展Python - official docs - defining new type
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)
,
"Kevin",
sizeof(kevin_KevinObject),
,
kevin_kevin_dealloc, /*tp_dealloc*/
, /*tp_print*/
, /*tp_getattr*/
, /*tp_setattr*/
, /*tp_compare*/
, /*tp_repr*/
}; static PyMethodDef kevin_methods[] = {
{"new_kevin", kevin_new_kevin, METH_VARARGS,
"Create a new Kevin object."},
{NULL, NULL, , 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的更多相关文章
- 使用C++扩展Python的功能 转自:http://blog.csdn.net/magictong/article/details/8897568#comments
使用C++扩展Python的功能 环境 VS2005Python2.5.4 Windows7(32位) 简介 长话短说,这里说的扩展Python功能与直接用其它语言写一个动态链接库,然后让Python ...
- 扩展Python模块系列(二)----一个简单的例子
本节使用一个简单的例子引出Python C/C++ API的详细使用方法.针对的是CPython的解释器. 目标:创建一个Python内建模块test,提供一个功能函数distance, 计算空间中两 ...
- 扩展Python模块系列(五)----异常和错误处理
在上一节中,讨论了在用C语言扩展Python模块时,应该如何处理无处不在的引用计数问题.重点关注的是在实现一个C Python的函数时,对于一个PyObject对象,何时调用Py_INCREF和Py_ ...
- 2019-02-18 扩展Python控制台实现中文反馈信息之二-正则替换
"中文编程"知乎专栏原文地址 续前文扩展Python控制台实现中文反馈信息, 实现了如下效果: >>> 学 Traceback (most recent call ...
- 使用c/c++扩展python
用python脚本写应用比较方便,但有时候由于种种原因需要扩展python(比如给程序提供python接口等). 之前一直想整理下,今天终于坐下来把这件事情给做了,这里记录下,也方便我以后查阅. 说明 ...
- 用 C 扩展 python
本文介绍如何用 C 语言来扩展 python.所举的例子是,为 python 添加一个设置字符串到 windows 的剪切板(Clipboard)的功能.我在写以下代码的时候用到的环境是:window ...
- C语言扩展Python模块
1. 先创建一个PythonDemo.cpp文件: //c/c++中调用python脚本,配置步骤参见上一篇:C/C++与python交互 \ C/C++中调用python文件. #include ...
- python matplotlib画图产生的Type 3 fonts字体没有嵌入问题
ScholarOne's 对python matplotlib画图产生的Type 3 fonts字体不兼容,更改措施: 在程序中添加如下语句 import matplotlib matplotlib. ...
- C扩展Python
基本想法: 先看中文小介绍,再看英文详细文档. 1. 参考 首先参考THIS, IBM的工程师好像出了好多这样的文章啊,而且每次看到时间戳,我都想戳自己- -! 2. ERROR 可能遇到错误: fa ...
随机推荐
- 使用文本文件(.txt)进行数据存取的技巧总结(相当的经典)
使用文本文件(.txt)进行数据存取的技巧总结(相当的经典) 使用文本文件(.txt)进行数据存取的技巧总结 由于本帖内容较多,部分转自他人的心得,因此,凡转贴的地方仅用“----转----”标注,原 ...
- [转载]Spring Beans Auto-Wiring
Autowiring Modes You have learnt how to declare beans using the <bean> element and inject < ...
- memory leak
In computer science, a memory leak occurs when a computer program incorrectly manages memory allocat ...
- this指针指向的彻底理解
首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然 ...
- JAVASCRIPT的一些知识点梳理
春节闲点,可以安心的梳理一下以前不是很清楚的东东.. 看的是以下几个URL: http://web.jobbole.com/82520/ http://blog.csdn.net/luoweifu/a ...
- PowerDesigner修改设计图中文字的字体大小等样式
设计图中默认的字体是对英文比较合适的,中文就看不清楚了,特别不美观.但是可以通过修改“Display Preferences”适应我们的汉字. 我使用的PowerDesigner版本是15.1(测试版 ...
- jndi配置数据源
jndi(java Naming and DirectoryInterface,java命名和目录接口)是一组在Java应用中访问命名和目录服务的API. 命名服务将名称和对象联系起来,使得我们可以用 ...
- 【mysql的编程专题】触发器
类似tp里面的数据模型回调接口,在数据表增删改的前或后触发执行其他的预订的sql; 一个触发器要具备4要素: 1.监视地点 -- 要执行触发器的表 2.监视事件 -- 由什么DML事件来牵引 3.触发 ...
- servlet会话技术:Session
问题的引出 1.在网上购物时,张三和李四购买的商品不一样,他们的购物车中显示的商品也不一样,这是怎么实现的呢? 2.不同的用户登录网站后,不管该用户浏览该网站的那个页面,都可以显示登录人的名字,同时可 ...
- 深入探索 Java 热部署
在 Java 开发领域,热部署一直是一个难以解决的问题,目前的 Java 虚拟机只能实现方法体的修改热部署,对于整个类的结构修改,仍然需要重启虚拟机,对类重新加载才能完成更新操作.对于某些大型的应用来 ...