[英]How can I use PyObject_IsInstance with a non-builtin class as second argument?
在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
则可以使用它。 如果从你想要使用PyObject_IsInstance
地方看不到类型对象(比如它叫做ProtocolType
),首先用以下方法声明一个原型:
extern PyTypeObject ProtocolType;
然后像这样使用它:
PyObject_IsInstance(object, reinterpret_cast<PyObject*>(&ProtocolType))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.