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

GDI*_*der 5 c python instance pyobject

在C / C ++中,我想查看a PyObject是否是实例。不幸的是,该PyInstance_Check宏不适用于新型类。

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

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

GDI*_*der 6

我终于根据该页面的内容找到了答案:Create instance of a python class , statements 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);
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么不简单地调用 `PyObject_GetAttrString()` 而不是 `PyModule_GetDict()` + `PyDict_GetItemString()` ?此外,“PyRef”不在 Python/C-API 参考中。它是从哪里来的? (2认同)