如何将PyObject_IsInstance与非内置类一起用作第二个参数?

时间:2012-08-08 14:52:34

标签: python c instance pyobject

在C / C ++中,我想看看PyObject是否是一个实例。不幸的是,PyInstance_Check宏不适用于新式类。

所以,根据我读过的论坛帖子,PyObject_IsInstance可以解决问题。但是,我发现的所有示例都展示了与内置类型(如整数和字符串)的比较。

我想知道如何构造一个表示类型类的PyObject,因此我可以将它传递给PyObject_IsInstance的第二个参数。你能救我吗?

2 个答案:

答案 0 :(得分:2)

我终于根据该页面的内容找到了答案:Create instance of a python class , declared in python, with C API

// PyInstance_Check works only for old-style classes.
qBool isInstance = PyInstance_Check(pyInstance);
if (!isInstance)
{
    // It might be an instance of a new-style class.
    //
    PyRef module = PyImport_ImportModule("module.where.myclass.is");
    PyObject* moduleDict = PyModule_GetDict(module.Get());
    PyObject* protocolClass = PyDict_GetItemString(moduleDict, "MyClass");

    int returnValue = PyObject_IsInstance(pyObject, protocolClass);
}

答案 1 :(得分:1)

如果在同一模块中定义了PyTypeObject,则可以使用相应的ProtocolType。如果从您想要使用PyObject_IsInstance的位置看不到类型对象(假设它称为extern PyTypeObject ProtocolType; ),请首先使用以下内容声明原型:

PyObject_IsInstance(object, reinterpret_cast<PyObject*>(&ProtocolType))

然后像这样使用它:

{{1}}