擅长:python、mysql、java
<p>问题是,当Boost.Python的元类试图声明和设置<code>Derived.say_hi</code>时,它会解析为<code>Base.say_hi.__set__</code>,因为它是从<code>Base</code>继承的现有类描述符。一个解决方案是自己将属性绑定到<code>Derived</code>类。例如</p>
<pre><code>namespace py = boost::python;
py::class_<Base>("Base").add_static_property("say_hi", &Base::say_hi);
py::class_<Derived, py::bases<Base>> Derived_("Derived");
PyDict_SetItemString(
py::downcast<PyTypeObject>(Derived_.ptr())->tp_dict,
"say_hi",
Derived_.attr("__base__").attr("__dict__")["say_hi"].attr("__class__")(
py::make_function(&Derived::say_hi)
).ptr()
);
</code></pre>
<p>这样<code>say_hi</code>作为<code>Boost.Python.StaticProperty</code>实例直接绑定到<code>Derived</code>类。现在输入以下代码:</p>
<pre><code>print(Base().say_hi, Base.say_hi, Derived().say_hi, Derived.say_hi)
</code></pre>
<p>将正确打印:</p>
<pre><code>Hi Hi Hello Hello
</code></pre>