5

PyObjectC/C++ で、aがインスタンスかどうかを確認したい。残念ながら、このPyInstance_Checkマクロは新しいスタイルのクラスでは機能しません。

したがって、私が読んだフォーラムの投稿によるとPyObject_IsInstance、問題を解決できます。ただし、私が見つけたすべての例は、int や string などの組み込み型との比較を示しています。

型のクラスを表す PyObject を構築する方法を知りたいので、それを の 2 番目の引数に渡すことができますPyObject_IsInstance。手伝って頂けますか?

4

2 に答える 2

4

そのページの内容に基づいて、私は最終的に自分で答えを見つけました: 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);
}
于 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 に答える