正如Ignacio所说,正确的方法是
tp_as_sequence
类型对象的成员。下面是一个最小的例子:
#include <Python.h>
/**
* C structure and methods definitions
*/
typedef struct {
PyObject_HEAD;
} TestObject;
static Py_ssize_t
TestClass_len(TestObject* self)
{
return 55;
}
/**
* Python definitions
*/
static PySequenceMethods TestClass_sequence_methods = {
TestClass_len, /* sq_length */
};
static PyTypeObject TestClass = {
PyObject_HEAD_INIT(NULL)
0, /*ob_size*/
"testmodule.TestClass", /*tp_name*/
sizeof(TestObject), /*tp_basicsize*/
};
/**
* Module entry point
*/
#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */
#define PyMODINIT_FUNC void
#endif
PyMODINIT_FUNC
inittestmodule(void)
{
PyObject* m;
TestClass.tp_new = PyType_GenericNew;
TestClass.tp_as_sequence = &TestClass_sequence_methods;
TestClass.tp_flags = Py_TPFLAGS_DEFAULT;
if (PyType_Ready(&TestClass) < 0)
return;
m = Py_InitModule3("testmodule", NULL, "");
Py_INCREF(&TestClass);
PyModule_AddObject(m, "TestClass", (PyObject *)&TestClass);
}
另一种(更复杂和更慢的)方法是添加
__len__
在模块的init函数中使用
PyCFunction_New
,
PyMethod_New
和
PyObject_SetAttr
. 这看起来更像您粘贴的代码,除了您定义的
爱伦尼亚
在C方法表中,这不起作用。