我正在努力解决在boost.python中暴露类的一些不必要的副作用。似乎在Python中,分配给原始类中从未定义的成员变量是合法的。因此,在下面的示例中,我定义了一个带有成员'a'的类,但是写成成员'b'也适用于Python。这具有(在我的情况下是否定的)副作用,当访问类成员时我无法检测拼写错误,因为myClass.complicatedObjectName = 1起作用且myclass.complicatedObjectname = 1也起作用,即使从未定义后一个变量也是如此。如图所示,当暴露像这样的类时
#include <boost/python.hpp>
using namespace boost::python;
class A {
public:
A() : a(1) {}
int a;
};
BOOST_PYTHON_MODULE(liba) {
class_<A>("A", init<>())
.def_readonly("a", &A::a);
}
并尝试访问A.a和A.b
import liba
myA = liba.A()
print "a", myA.a
myA.b = 1
print "b", myA.b
生成输出:
a 1
b 1
我希望赋值'myA.B = 1'失败。有没有办法使boost.python表现得像这样?
如果这个问题已在某个地方被问过,我很抱歉,但我找不到答案。感谢您指出我现有的答案,如果有的话。
我在Ubuntu 14.04上使用标准的boost库(v 1.54)。
答案 0 :(得分:1)
在python中,您可以覆盖_setattr_
以仅允许来自已定义列表的属性名称。以下是如何执行此操作:On Topic。
然后一些想法如何在C ++中实现相同:https://stackoverflow.com/questions/3079306/how-to-protect-againt-typos-when-setting-value-for-class-members和How to override __setattr__ in a wrapped class (from C++)?。