繁体   English   中英

Python和动态扩展C ++类

[英]Python and Dynamically Extending C++ Classes

因此,我在Python中遇到了自定义类型,函数和属性的问题。

当我使用Python并想在一种自定义类型上设置属性时(例如Vector4),我的代码将为const char* attribute_name参数获取一个NULL(是的,我正在导入我的模块)。

奇怪的是,当我在setter函数中硬编码属性名称时,出现错误:

SystemError: error return without exception set

我确实看到在Python(以及在C ++中)创建的对象,所以我不认为这是问题所在。 如果setattro挂钩确实在C ++中成功设置了属性,则返回1,并且我看到代码被调用并在C ++端设置了属性。 设置属性时,不会引发任何错误/异常。

此外,当我在Python中对类的实例调用函数时,它将调用tp_getattro设置的函数,而不是检查字典。

我不确定为什么,也许是因为我正在设置字典并将函数放在其中,而不是通过PyModuleDef数组进行操作,因此调用PyType_Ready时看不到函数。

有谁知道为什么会这样? 我们正在使用Python 3.2。


相关:

我有一个基本类型( tp_newtp_dealloc ),然后在运行时创建派生类型。 派生类型具有字典tp_basetp_getattrotp_setattro

这是将函数绑定到Python类/类型的方式:

PyMethodDef newMethod;
newMethod.ml_doc = newMethod.ml_name = funcName;
newMethod.ml_flags = METH_VARARGS;
newMethod.ml_meth = pythonFunc;

PyGeneralObj* selfFake = PyObject_New(PyGeneralObj, &MetaEngineType);
selfFake->className = className;
selfFake->funcName = funcName;
Py_INCREF((PyObject*)selfFake);

PyObject *func = PyCFunction_New(&newMethod, (PyObject*)selfFake);
PyObject *method = PyInstanceMethod_New(func);

ErrorIf((method == NULL), "Python: Cannot create instance function. %s", 
funcName);

ErrorIf((PyDict_SetItem(classObj->m_pyClassType->tp_dict,            
PyReturnStr(newMethod.ml_name), method) == -1), 
"Python: Cannot create function in dictionary.");

Py_DECREF(func);
Py_DECREF(method);

其中funcName和className为const char *。 pythonFunc是一个通用的python函数,用于处理调用绑定到我们的元系统的所有函数。 classObj是指向具有成员m_pyClassType(PyTypeObject的类型)的PythonClass的指针。

PyGeneralObj是一个新的对象,具有两个const char *和一个void *(这是C ++中的对象)

我执行PyType_Ready并且没有错误,然后增加我的类型。 然后,将对象添加到从PyImport_ImportModule获得的模块PyObject中。 我确实将主模块附加到运行时,并初始化python并导入我的模块。


如果需要更多信息/代码,我可以发布更多信息。 我希望这是有道理的,这是我第一次在stackoverflow上发帖。

为了澄清起见,我们希望具有在C ++端完全解析的动态属性。 对于函数,我希望能够重写PyObject* self变量,以便可以获取需要调用的函数的字符串名称。

我们不想使用第三方库/接口,例如Boost,Cython等。

问题出在我实现getattro上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM