<p>看看<code>Boost Python</code>是如何公开静态属性的,以及它在<code>Python</code>中的行为,看起来这是<code>Boost Python</code>中的一个bug</p>
<p>当我尝试导入有问题的示例时,出现以下错误:</p>
<pre><code>>>> import HelloBoostPython
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: can't set attribute
>>>
</code></pre>
<p>无法设置该属性,因为派生类中存在冲突<code>Derived</code>类首先从<code>Base</code>继承<code>say_hi</code>属性,然后尝试定义它自己的属性。这可以通过将<code>Derived</code>类中的<code>say_hi</code>更改为<code>say_hello</code>来轻松验证,正如作者所做的那样:</p>
<p><code>py::class_<Derived, py::bases<Base>>("Derived").add_static_property("say_hello", &Derived::say_hi);</code></p>
<p>然后我们可以看到以下数据描述符<code>help(HelloBoostPython.Derived)</code>:</p>
<pre><code> class Derived(Base)
...
...
|
| Data descriptors defined here:
|
| say_hello
|
|
| Data and other attributes defined here:
|
| __instance_size__ = 24
|
|
| Data descriptors inherited from Base:
|
| say_hi
...
...
</code></pre>
<p>但是,当我们在python中定义类似的内容时:</p>
<pre><code>class Base(object):
def get_say_hi(self):
return "hi"
say_hi = property(get_say_hi)
class Derived(Base):
def get_say_hi(self):
return "hello"
say_hi = property(get_say_hi)
</code></pre>
<p>我们可以看到这里只有<code>say_hi</code>中定义的<code>Derived</code>:</p>
<pre><code>class Derived(Base)
...
...
|
| Data descriptors defined here:
|
| say_hi
|
|
| Data descriptors inherited from Base:
|
| __dict__
| dictionary for instance variables (if defined)
|
| __weakref__
| list of weak references to the object (if defined)
(END)
</code></pre>
<p>从<code>Derived</code>中删除<code>say_hi</code>后:</p>
<pre><code>class Base(object):
def get_say_hi(self):
return "hi"
say_hi = property(get_say_hi)
class Derived(Base):
None
</code></pre>
<p>我们从<code>Base</code>继承它,然后:</p>
<pre><code>class Derived(Base)
...
...
|
| Data descriptors inherited from Base:
|
| __dict__
| dictionary for instance variables (if defined)
|
| __weakref__
| list of weak references to the object (if defined)
|
| say_hi
(END)
</code></pre>