How can I use PyObject_IsInstance with a non-builtin class as second argument?

荒凉一梦 提交于 2019-12-22 06:34:29

问题


In C/C++, I want to see if a PyObject is an instance. Unfortunately, the PyInstance_Check macro doesn't work with new-style classes.

So, according to forums posts that I read, PyObject_IsInstance could solve the problem. However, all the examples that I have found are demonstrating comparisons with built-in types, like ints and strings.

I want to know how I can construct a PyObject that represents a class of a type, so I can pass it to the second argument of PyObject_IsInstance. Can you help me?


回答1:


I have finally found the answer myself, based on the contents of that page: 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);
}



回答2:


You could use the corresponding PyTypeObject if it is defined in the same module. If the type object (let's say it's called ProtocolType) is not visible from where you want to use PyObject_IsInstance, first declare a prototype with:

extern PyTypeObject ProtocolType;

And then use it like this:

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


来源:https://stackoverflow.com/questions/11867227/how-can-i-use-pyobject-isinstance-with-a-non-builtin-class-as-second-argument

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!