大規模なライブラリ (具体的には OpenBabel) に依存し、そのクラスの一部をクラスのベースとして使用する C++ コードがあります。このライブラリには、SWIG で作成された独自の Python バインディングがあります。このライブラリのインターフェイスの '%import' を使用して、コード用に SWIG で Python バインディングを構築しました。私のクラスを Python コードでライブラリのルーチンに渡す場合、これは問題なく機能します。ただし、クラスからライブラリのルーチンを取得する際に問題が発生します。
アイデアを明確にするために、いくつかのコードを示します。C++版の場合
class Derived: public Library::Base
{
// blah-blah
std::string toString();
};
// the library has function, returning Base*
Library::Base* getData();
// In C++ code I siply use
Derived *d = static_cast<Derived*> (getData());
std::cout << d.toString();
今、私はPythonで同じことをしたい:
d = getData();
print( d.toString() )
これにより、エラーが発生します。AttributeError: 'Base' object has no attribute 'toString'
print(d)
<Library.Base; proxy of <Swig Object of type 'std::vector< Library::Base * >::value_type' at 0x7f0ff8279a20> >
これは C++ のラッパーです。Base*
アップキャストに関するこのアドバイスを見つけました: d.__class__ = Derived
、しかし、これは私にとって奇妙に見えます。また、うまくいきません。
では、Pythonでどのようにアップキャストする必要がありますか、または何が間違っていますか?