注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Code@Pig Home

喜欢背着一袋Code傻笑的Pig .. 忧美.欢笑.记忆.忘却 .之. 角落

 
 
 

日志

 
 

[python] 自定义PyObject  

2011-06-08 11:06:34|  分类: lang_python |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
很简单,定义个 PyTypeObject,注册到一个 module 中即可。

----------------------------------------------------------------------------------
#include <Python.h>

typedef struct {
    PyObject_HEAD
} noddy_NoddyObject;

static PyTypeObject noddy_NoddyType = {
    PyObject_HEAD_INIT(NULL)
    0,                         /*ob_size*/
    "noddy.Noddy",             /*tp_name*/
    sizeof(noddy_NoddyObject), /*tp_basicsize*/
    0,                         /*tp_itemsize*/
    0,                         /*tp_dealloc*/
    0,                         /*tp_print*/
    0,                         /*tp_getattr*/
    0,                         /*tp_setattr*/
    0,                         /*tp_compare*/
    0,                         /*tp_repr*/
    0,                         /*tp_as_number*/
    0,                         /*tp_as_sequence*/
    0,                         /*tp_as_mapping*/
    0,                         /*tp_hash */
    0,                         /*tp_call*/
    0,                         /*tp_str*/
    0,                         /*tp_getattro*/
    0,                         /*tp_setattro*/
    0,                         /*tp_as_buffer*/
    Py_TPFLAGS_DEFAULT,        /*tp_flags*/
    "Noddy objects",           /* tp_doc */
};

static PyMethodDef noddy_methods[] = {
    {NULL}  /* Sentinel */
};

PyMODINIT_FUNC
initnoddy(void)
{
    PyObject *m;

    noddy_NoddyType.tp_new = PyType_GenericNew;
    if (PyType_Ready(&noddy_NoddyType) < 0)
        return;
    Py_INCREF(&noddy_NoddyType);

    m = Py_InitModule3("noddy", noddy_methods, "example module");
    PyModule_AddObject(m, "Noddy", (PyObject*)&noddy_NoddyType);
}
----------------------------------------------------------------------------------
>>> import noddy
>>> dir(noddy)
['Noddy', '__doc__', '__file__', '__name__', '__package__']
>>> noddy
<module 'noddy' from '...\noddy.pyd'>
>>> a = noddy.Noddy()
>>> a
<noddy.Noddy object at 0x00CB14F0>
----------------------------------------------------------------------------------

进阶:
1. 给自定义class增加attribute
2. 让自定义class支持cyclic gc (If we had written custom tp_alloc or tp_free slots, we'd need to modify them for cyclic-garbage collection)

参考:
Extending and Embedding the Python Interpreter => Defining New Types
  评论这张
 
阅读(1406)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017