如何将带有非内置类的PyObject_IsInstance用作第二个参数



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

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

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

根据该页面的内容,我终于自己找到了答案: 使用 C API 创建 python 类的实例,用 python 声明

// 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);
}
如果在同一

模块中定义了相应的PyTypeObject,则可以使用相应的。如果类型对象(假设它被称为 ProtocolType)在你想使用PyObject_IsInstance的地方不可见,首先声明一个原型:

extern PyTypeObject ProtocolType;

然后像这样使用它:

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

最新更新