[C++-sig] Exposing simple polymorphism with boost python
Stefan Seefeld
stefan at seefeld.name
Fri Oct 24 13:09:42 CEST 2014
On 23/10/14 03:38 AM, Erik Türke wrote:
> Hi Python-Experts :-)
>
>
> i am starting to get really frustrated trying to expose a simple C++
> polymorphism to python with boost::python.
> I do have the following structure in C++:
>
> struct Base {
> int typeID;
> };
>
> struct Derived : public Base {
> int derivedProperty;
> }
>
> //and some more from base derived types....
>
> Base *returnSomethingDerivedFromBase(...) {
> Derived *ret = new Derived;
> ret->derivedProperty = 1234;
> return ret;
> }
>
> BOOST_PYTHON_MODULE(foo)
> {
> class_<Base>("Base")
> .add_property("baseProperty", &Base::baseProperty);
>
> class_<Derived, bases<Base> >("Derived")
> .add_property("derivedProperty", &Derived::derivedProperty);
>
> def("returnSomethingDerivedFromBase",
> returnSomethingDerivedFromBase);
> }
>
>
> And in Python i just want to have the following:
>
> object = returnSomethingFromDerived() #object is of type Base
> if object.typeID = 1:
Typo: you likely mean '==', not '='.
> #here i want to cast to Derived and access "derivedProperty"
> #but this is not working :-( :
> object.__class__ = Derived
That's indeed not possible. But I also don't know why you want that.
The objet presumably already is of type 'Derived', so there is nothing
to cast. (In Python all attribute lookups happen at call-time.)
>
> Is there a way to accomplish this at all? Or isn´t this possible as it
> would be in C++ ?
Both C++ and Python are strongly typed (i.e., all objects have a
specific type, with specific methods bound to them). But contrary to
C++, Python also is dynamically typed, so you can reassign a new object
with a different type to an existing variable. In that context, casting
isn't of any use.
Or perhaps a more complete example would be useful to demonstrate your
needs, so we can look into how best to support that in Python.
HTH,
Stefan
--
...ich hab' noch einen Koffer in Berlin...
More information about the Cplusplus-sig
mailing list