在C++中通过继承自定义PyObject
Custom PyObject by inheritance in C++
长期python程序员,第一次编写C++扩展程序。无论如何,为了好玩,我正在尝试用C++为python创建一个链表模块。这是我的代码
#include <python2.7/Python.h>
#include <iostream>
using namespace std;
template <typename T>
class LinkedList : public PyObject {
private:
struct ListNode {
ListNode(T value, ListNode* next)
: value(value), next(next) {}
T value;
ListNode* next;
};
ListNode* head;
public:
LinkedList(T value)
: head(new ListNode(value, 0)) {
cout << "class constructed" << endl;
Py_INCREF(this);
}
void get_value() {
cout << "test" << endl;
}
~LinkedList() {
delete head;
Py_DECREF(this);
cout << "class destructed" << endl;
}
};
static PyObject* linkedlist_new(PyObject* self, PyObject* args) {
LinkedList<char*> ll("hello");
return Py_BuildValue("O", &ll);
}
static PyMethodDef LinkedListMethods[] = {
{"new", linkedlist_new, METH_VARARGS,
"Create a new linked list."},
{NULL, NULL, 0, NULL}
};
extern "C" PyMODINIT_FUNC initLinkedList(void) {
(void) Py_InitModule("LinkedList", LinkedListMethods);
}
我能做这个吗?大多数文档都是针对C的,但我可以从PyObject继承并像这样返回吗?现在有效的是:
import LinkedList
print "start"
l = LinkedList.new()
print "done"
但当我在python中调用l.get_value()
时,我会得到一个segfault。我知道我所做的可能是错误的,所以有人会好心地为我指明正确的方向吗?
为了澄清,我知道名为"ll"的LinkedList<char*>
在linkedlist_new
函数完成后被破坏,这是我遇到的问题的一部分。让我们假设我非常非常失落。。。
首先:您可能需要手动设置对象标头——换句话说,更改
template <typename T>
class LinkedList : public PyObject { /* … */ }
类似
template <typename T>
class LinkedList {
public:
PyObject_HEAD
/// …
}
…根据我自己的经验,如果Python对象的API的其余部分正确填充,则后一种方法有效。这是第二点:你没有定义PyTypeObject
,它有点复杂(q.v。https://docs.python.org/2/c-api/typeobj.html)比你在这里拥有的还要多。
具体来说,您需要一个PyTypeObject
,它对应于您打算向用户公开的每个PyObject
派生的结构,因此,尽管模板化的PyObject
派生的LinkedList
类一开始听起来可能很棒,记住PyTypeObject
结构(因为面向用户的模块表示不可避免地必须具体定义其中的一个或多个),以及LinkList
最终专用的typename
参数。
相关文章:
- 自定义异常中的用户定义的空构造函数,具有多个继承和抽象基类
- 类继承自QLabel,为什么不调用自定义插槽?
- 无法创建两个从 std::logic_error 继承的自定义异常类
- 在继承的接口中调用自定义代码
- 继承自定义选项卡栏和调整大小事件的实现
- 自定义内存分配和多个继承类的解除分配
- 将从基类继承的构造函数与自定义构造函数混合使用
- 我们可以用自定义函数扩展现有的类吗?(无继承)
- 为自定义类继承std::vector::迭代器
- 从boost::exception和std::runtime_error继承自定义异常类
- 自定义套接字继承自boost::asio::ip::tcp::Socket
- 如何在 C++11 的用户自定义类模板中继承 std::vector 模板
- 如何从继承的自定义类 c++ 创建类型
- 是否可以检查是否为类定义了成员函数,即使该成员继承自未知基类
- 有没有办法避免在特定自定义类继承结构中使用虚拟方法
- 如何从我的自定义类继承
- 继承类使用非默认构造函数初始化自定义类
- 继承自 std::vector<T> 和重载运算符 [] 用于自定义索引
- 在C++中通过继承自定义PyObject
- 在定义自定义接口时继承库类