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 kevinTraceback (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的更多相关文章

  1. 使用C++扩展Python的功能 转自:http://blog.csdn.net/magictong/article/details/8897568#comments

    使用C++扩展Python的功能 环境 VS2005Python2.5.4 Windows7(32位) 简介 长话短说,这里说的扩展Python功能与直接用其它语言写一个动态链接库,然后让Python ...

  2. 扩展Python模块系列(二)----一个简单的例子

    本节使用一个简单的例子引出Python C/C++ API的详细使用方法.针对的是CPython的解释器. 目标:创建一个Python内建模块test,提供一个功能函数distance, 计算空间中两 ...

  3. 扩展Python模块系列(五)----异常和错误处理

    在上一节中,讨论了在用C语言扩展Python模块时,应该如何处理无处不在的引用计数问题.重点关注的是在实现一个C Python的函数时,对于一个PyObject对象,何时调用Py_INCREF和Py_ ...

  4. 使用c/c++扩展python

    用python脚本写应用比较方便,但有时候由于种种原因需要扩展python(比如给程序提供python接口等). 之前一直想整理下,今天终于坐下来把这件事情给做了,这里记录下,也方便我以后查阅. 说明 ...

  5. 用 C 扩展 python

    本文介绍如何用 C 语言来扩展 python.所举的例子是,为 python 添加一个设置字符串到 windows 的剪切板(Clipboard)的功能.我在写以下代码的时候用到的环境是:window ...

  6. C语言扩展Python模块

    1. 先创建一个PythonDemo.cpp文件: //c/c++中调用python脚本,配置步骤参见上一篇:C/C++与python交互 \  C/C++中调用python文件. #include ...

  7. python matplotlib画图产生的Type 3 fonts字体没有嵌入问题

    ScholarOne's 对python matplotlib画图产生的Type 3 fonts字体不兼容,更改措施: 在程序中添加如下语句 import matplotlib matplotlib. ...

  8. C扩展Python

    基本想法: 先看中文小介绍,再看英文详细文档. 1. 参考 首先参考THIS, IBM的工程师好像出了好多这样的文章啊,而且每次看到时间戳,我都想戳自己- -! 2. ERROR 可能遇到错误: fa ...

  9. 扩展Python模块系列(三)----参数解析与结果封装

    在上一节中,通过一个简单的例子介绍了C语言扩展Python内建模块的整体流程,从本节开始讲开始深入讨论一些细节问题,在细节讨论中从始至终都会涉及[引用计数]的问题.首先讨论C语言封装的Python函数 ...

随机推荐

  1. Android立体旋转动画实现与封装(支持以X、Y、Z三个轴为轴心旋转)

    本文主要介绍Android立体旋转动画,或者3D旋转,下图是我自己实现的一个界面 立体旋转分为以下三种: 1. 以X轴为轴心旋转 2. 以Y轴为轴心旋转 3. 以Z轴为轴心旋转--这种等价于andro ...

  2. Python开发入门与实战21-订阅事件(subscribe)

    21. 订阅事件(subscribe) 新用户关注微信公众平台,将产生一个订阅事件,即subscribe事件,在新用户关注公众平台后为新用户提供一些简明扼要的公众号说明 事件推送(event): 接收 ...

  3. bs4 python解析html

    使用文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/ python的编码问题比较恶心. decode解码encode编码 在文件 ...

  4. PHPExcel 导出时乱码

    今天遇到了个奇怪的问题..猜测应该是因为php文件的编码造成的,但是没有解决办法. 问题是,用PHPEXCEL导出文件的时候,相同的代码在一个文件中可以导出,在另一个文件中却不行.. 最后没有办法,只 ...

  5. 统计代码git提交的行数

    $ git log --author="$(git config --get user.name)" --pretty=tformat: --numstat | gawk '{ a ...

  6. HTTP协议/RTSP协议/RTMP协议的区别

    RTSP. RTMP.HTTP的共同点.区别 共同点: 1:RTSP RTMP HTTP都是在应用应用层. 2: 理论上RTSP RTMPHTTP都可以做直播和点播,但一般做直播用RTSP RTMP, ...

  7. 转载:C++线程池的一个实现

    原文转自:http://www.cnblogs.com/lidabo/p/3328646.html 略有修改 Cthread类参见:http://www.cnblogs.com/tangxin-blo ...

  8. (DFS)hdoj1175:连连看

    题目链接 这道题被稍微改编当作过去年的期末上机题,也被直接放到了这次这一届的第二次练习赛.当初刚看到这道题时DFS并没有系统的学过,做起来极其费劲.现在学过之后开始实践练习,发现这道题真的是很水. 我 ...

  9. Oracle数据库备份手册

    1         故障类型 l  实例故障 由ORACLE内部异常.操作系统故障或其它相关软件引起,导致ORACLE实例中的进程或内存区出现故障或数据库无法正常关闭,这种故障称为实例故障.实例故障没 ...

  10. linearlayout 水平垂直居中

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=&q ...