<br>There&#39;s been some progress, using the boost object implementation.<br>However it appears that the &quot;chg&quot; method of the DerivedO object is not<br>overridden properly.&nbsp; So when it is changed in python, I get what I<br>
expect, but when it is changed in C++, it appears to run the Base::chg<br>method instead of the DerivedO::chg method.&nbsp; I&#39;m sure I&#39;m only missing<br>some tiny detail now.<br><br>---- mymodule.cpp ------------------------------------------------<br>
<br>#define MYTYPE object<br>#define MYDEFAULT object(0)<br><br>/*<br><br>#define MYTYPE string<br>#define MYDEFAULT &quot;&quot;<br><br>*/<br><br><br>#include &lt;iostream&gt;<br>#include &lt;fstream&gt;<br>#include &lt;string&gt;<br>
using namespace std;<br><br>#include &lt;boost/python.hpp&gt;<br>using namespace boost::python;<br><br>struct Base <br>{<br>&nbsp; Base() { s = MYDEFAULT ; }<br>&nbsp; Base(MYTYPE input){ s = input; }<br>&nbsp; virtual ~Base() {}<br>&nbsp; virtual MYTYPE run() { return s; }<br>
&nbsp; virtual void&nbsp;&nbsp; chg(MYTYPE input) { s = input; }<br>private:<br>&nbsp; MYTYPE s;<br>};<br><br>struct BaseWrap : Base, wrapper&lt;Base&gt;<br>{<br>&nbsp; BaseWrap() : Base() {}<br>&nbsp; BaseWrap(MYTYPE input) : Base(input) {}<br><br>&nbsp; MYTYPE run() {<br>
&nbsp;&nbsp;&nbsp; if (override run = this-&gt;get_override(&quot;run&quot;))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return run();<br>&nbsp;&nbsp;&nbsp; return Base::run();<br>&nbsp; }<br><br>&nbsp; MYTYPE default_run() {<br>&nbsp;&nbsp;&nbsp; return this-&gt;Base::run();<br>&nbsp; }<br><br>&nbsp; void chg(MYTYPE input) {<br>
&nbsp;&nbsp;&nbsp; if (override chg = this-&gt;get_override(&quot;chg&quot;))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chg(input);<br>&nbsp;&nbsp;&nbsp; Base::chg(input);<br>&nbsp; }<br><br>&nbsp; void default_chg(MYTYPE input) {<br>&nbsp;&nbsp;&nbsp; this-&gt;Base::chg(input);<br>&nbsp; }<br>};<br><br>typedef boost::shared_ptr&lt;Base&gt; BasePtr;<br>
<br>BasePtr g(new Base);<br><br>BasePtr get_g() {<br>&nbsp; return g;<br>}<br><br>BasePtr set_g(BasePtr input_g) {<br>&nbsp; BasePtr tmp;<br>&nbsp; tmp = g;<br>&nbsp; g = input_g;<br>&nbsp; return tmp;<br>}<br><br>MYTYPE run_g() {<br>&nbsp; MYTYPE tmp;<br>
&nbsp; tmp = g-&gt;run();<br>&nbsp; return tmp;<br>}<br><br>void chg_g(MYTYPE input) {<br>&nbsp; g-&gt;chg(input);<br>}<br><br>BOOST_PYTHON_MODULE(mymodule) {<br>&nbsp; <br>&nbsp; def(&quot;set_g&quot;, set_g);<br>&nbsp; def(&quot;get_g&quot;, get_g);<br>
&nbsp; def(&quot;run_g&quot;, run_g);<br>&nbsp; def(&quot;chg_g&quot;, chg_g);<br><br>&nbsp; class_&lt;BaseWrap, boost::noncopyable&gt;(&quot;Base&quot;, init&lt;&gt;()) <br>&nbsp;&nbsp;&nbsp; .def(init&lt;MYTYPE&gt;())<br>&nbsp;&nbsp;&nbsp; .def(&quot;run&quot;, &amp;Base::run, &amp;BaseWrap::default_run)<br>
&nbsp;&nbsp;&nbsp; .def(&quot;chg&quot;, &amp;Base::chg, &amp;BaseWrap::default_chg)<br>&nbsp;&nbsp;&nbsp; ;<br><br>&nbsp; register_ptr_to_python&lt; BasePtr &gt;();<br><br>}<br><br>---- test.py ------------------------------------------------<br><br>#!/usr/bin/env python<br>
<br>from mymodule import *<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>class DerivedS( Base ):<br>&nbsp;&nbsp;&nbsp; def run( self ):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x = Base.run( self )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return x+x<br><br>class DerivedO( Base ):<br>&nbsp;&nbsp;&nbsp; def chg( self, val ):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y = [1,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.0,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;string&#39;,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&#39;array&#39;],<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&#39;tuple&#39;,)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ][val]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Base.chg( self, y )<br>&nbsp;&nbsp;&nbsp; def run( self ):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x = Base.run( self )<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return x+x # defined for all 5 types above.<br><br>---- test run ------------------------------------------------<br><br>&gt;&gt;&gt; from mymodule import *<br>&gt;&gt;&gt; b1 = Base()<br>&gt;&gt;&gt; b1.run()<br>
0<br>&gt;&gt;&gt; x = b1.run()<br>&gt;&gt;&gt; set_g(b1)<br>&lt;mymodule.Base object at 0x4020d3ac&gt;<br>&gt;&gt;&gt; run_g()<br>0<br>&gt;&gt;&gt; b2 = Base(&#39;init_str&#39;)<br>&gt;&gt;&gt; ib1 = set_g(b2)<br>&gt;&gt;&gt; ib1.run()<br>
0<br>&gt;&gt;&gt; b2.run()<br>&#39;init_str&#39;<br>&gt;&gt;&gt; run_g()<br>&#39;init_str&#39;<br>&gt;&gt;&gt; chg_g(40)<br>&gt;&gt;&gt; b2.run()<br>40<br>&gt;&gt;&gt; run_g()<br>40<br>&gt;&gt;&gt; ds = DerivedS(&#39;derived&#39;)<br>
&gt;&gt;&gt; ib2=set_g(ds)<br>&gt;&gt;&gt; ib2.run()<br>40<br>&gt;&gt;&gt; ds.run()<br>&#39;derivedderived&#39;<br>&gt;&gt;&gt; run_g()<br>&#39;derivedderived&#39;<br>&gt;&gt;&gt; ds.chg(&#39;changed in python &#39;)<br>&gt;&gt;&gt; ds.run()<br>
&#39;changed in python changed in python &#39;<br>&gt;&gt;&gt; chg_g(&#39;changed in C++ &#39;)<br>&gt;&gt;&gt; run_g()<br>&#39;changed in C++ changed in C++ &#39;<br>&gt;&gt;&gt; ds.run()<br>&#39;changed in C++ changed in C++ &#39;<br>
&gt;&gt;&gt; class DerivedO( Base ):<br>...&nbsp;&nbsp;&nbsp;&nbsp; def chg( self, val ):<br>...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y = [1,<br>...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.0,<br>...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;string&#39;,<br>...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&#39;array&#39;],<br>...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&#39;tuple&#39;,)<br>
...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ][val]<br>...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Base.chg( self, y )<br>...&nbsp;&nbsp;&nbsp;&nbsp; def run( self ):<br>...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x = Base.run( self )<br>...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return x+x # defined for all 5 types above.<br>...<br>&gt;&gt;&gt; do = DerivedO()<br>
&gt;&gt;&gt; do.run()<br>0<br>&gt;&gt;&gt; ids = set_g(do)<br>&gt;&gt;&gt; ids.run()<br>&#39;changed in C++ changed in C++ &#39;<br>&gt;&gt;&gt; do.chg(1)<br>&gt;&gt;&gt; do.run()<br>2.0<br>&gt;&gt;&gt; do.chg(2)<br>&gt;&gt;&gt; do.run()<br>
&#39;stringstring&#39;<br>&gt;&gt;&gt; do.chg(3)<br>&gt;&gt;&gt; do.run()<br>[&#39;array&#39;, &#39;array&#39;]<br>&gt;&gt;&gt; run_g()<br>[&#39;array&#39;, &#39;array&#39;]<br>&gt;&gt;&gt; do.chg(4)<br>&gt;&gt;&gt; run_g()<br>
(&#39;tuple&#39;, &#39;tuple&#39;)<br>&gt;&gt;&gt; chg_g(2)<br>&gt;&gt;&gt; do.run()<br>4<br>&gt;&gt;&gt; chg_g(1)<br>&gt;&gt;&gt; do.run()<br>2<br>&gt;&gt;&gt; chg_g(&#39;this is &#39;)<br>Traceback (most recent call last):<br>
&nbsp; File &quot;&lt;stdin&gt;&quot;, line 1, in &lt;module&gt;<br>&nbsp; File &quot;&lt;stdin&gt;&quot;, line 8, in chg<br>TypeError: list indices must be integers<br>&gt;&gt;&gt; chg_g(3)<br>&gt;&gt;&gt; run_g()<br>6<br>&gt;&gt;&gt; do.chg(1)<br>
&gt;&gt;&gt; do.run()<br>2.0<br>&gt;&gt;&gt; do.chg(2)<br>&gt;&gt;&gt; do.run()<br>&#39;stringstring&#39;<br>&gt;&gt;&gt; do.chg(3)<br>&gt;&gt;&gt; do.run()<br>[&#39;array&#39;, &#39;array&#39;]<br>&gt;&gt;&gt; do.chg(4)<br>
&gt;&gt;&gt; do.run()<br>(&#39;tuple&#39;, &#39;tuple&#39;)<br>&gt;&gt;&gt; do.chg(0)<br>&gt;&gt;&gt; do.run()<br>2<br>&gt;&gt;&gt; run_g()<br>2<br>&gt;&gt;&gt; chg_g(0)<br>&gt;&gt;&gt; run_g()<br>0<br>&gt;&gt;&gt; chg_g(1)<br>
&gt;&gt;&gt; run_g()<br>2<br>&gt;&gt;&gt; chg_g(2)<br>&gt;&gt;&gt; run_g()<br>4<br>&gt;&gt;&gt; do.run()<br>4<br>&gt;&gt;&gt; do.chg(2)<br>&gt;&gt;&gt; do.run()<br>&#39;stringstring&#39;<br>&gt;&gt;&gt; run_g()<br>&#39;stringstring&#39;<br>
&gt;&gt;&gt; chg_g(2)<br>&gt;&gt;&gt; do.run()<br>4<br>&gt;&gt;&gt; run_g()<br>4<br>&gt;&gt;&gt; <br>