1

大規模なライブラリ (具体的には 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でどのようにアップキャストする必要がありますか、または何が間違っていますか?

4

1 に答える 1