У меня есть код C ++, который зависит от большой библиотеки (в частности, OpenBabel) и использует некоторые из ее классов в качестве основы для моих классов. Эта библиотека имеет свои собственные привязки Python, созданные с помощью SWIG. Я построил привязки Python с помощью SWIG для своего кода с «% import» интерфейса этой библиотеки. Когда дело доходит до передачи моих классов в подпрограммы библиотеки в коде 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
Однако это выглядит странно для меня. Более того, это не работает.
Итак, как я должен upcast в Python, или что я делаю не так?
как насчет использования:
print(str(d))