Как использовать PyObject_IsInstance с не встроенным классом в качестве второго аргумента?

В C / C ++ я хочу увидеть, является ли PyObject экземпляром. К сожалению, макрос PyInstance_Check не работает с классами нового стиля.

Итак, согласно сообщениям в форумах, которые я читал, PyObject_IsInstance мог решить проблему. Тем не менее, все примеры, которые я нашел, демонстрируют сравнение со встроенными типами, такими как int и строки.

Я хочу знать, как я могу построить PyObject, представляющий класс типа, поэтому я могу передать его во второй аргумент PyObject_IsInstance . Вы можете мне помочь?

    2 Solutions collect form web for “Как использовать PyObject_IsInstance с не встроенным классом в качестве второго аргумента?”

    Я, наконец, нашел ответ сам, основываясь на содержании этой страницы: Создать экземпляр класса python, объявленного в python, с API C

     // 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) 
    Python - лучший язык программирования в мире.