5

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

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

我想知道如何构造一个代表一个类型的类的 PyObject,所以我可以将它传递给PyObject_IsInstance. 你能帮助我吗?

4

2 回答 2

4

根据该页面的内容,我终于自己找到了答案: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);
}
于 2012-08-08T16:50:02.807 回答
1

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

extern PyTypeObject ProtocolType;

然后像这样使用它:

PyObject_IsInstance(object, reinterpret_cast<PyObject*>(&ProtocolType))
于 2013-03-09T14:23:32.120 回答