在boost python中公开类时访问未定义的成员变量

时间:2015-08-11 10:31:52

标签: boost-python

我正在努力解决在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)。

1 个答案:

答案 0 :(得分:1)

在python中,您可以覆盖_setattr_以仅允许来自已定义列表的属性名称。以下是如何执行此操作:On Topic

然后一些想法如何在C ++中实现相同:https://stackoverflow.com/questions/3079306/how-to-protect-againt-typos-when-setting-value-for-class-membersHow to override __setattr__ in a wrapped class (from C++)?