Глядя на то, как Boost Python
выставляет свойство stati c и как оно ведет себя в Python
, похоже, что это ошибка в Boost Python
.
Я получаю следующую ошибку, когда я попробуйте импортировать проблемный пример c:
>>> import HelloBoostPython
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: can't set attribute
>>>
Атрибут не может быть установлен, поскольку в производном классе есть cla sh. Класс Derived
сначала наследует свойство say_hi
от Base
, а затем пытается определить свое собственное. Это можно легко проверить, изменив say_hi
на say_hello
в классе Derived
, как это было сделано автором:
py::class_<Derived, py::bases<Base>>("Derived").add_static_property("say_hello", &Derived::say_hi);
Затем мы можем увидеть следующие дескрипторы данных help(HelloBoostPython.Derived)
:
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
...
...
Однако, когда мы определяем подобное в python:
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)
Мы можем видеть, что здесь у нас есть только say_hi
, определенное в Derived
:
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)
И после удаления say_hi
из Derived
:
class Base(object):
def get_say_hi(self):
return "hi"
say_hi = property(get_say_hi)
class Derived(Base):
None
Мы получаем его по наследству от Base
, затем:
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)