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

Access to undefined member variables when exposing a class in boost python

我正在努力应对在 boost.python 中公开 class 的一些不良副作用。似乎在Python中,赋值给一个在原class中从未定义过的成员变量是合法的。因此,在下面的示例中,我定义了一个 class 和一个成员 'a',但也可以在 Python 中写入一个成员 'b'。这具有(在我的情况下是负面的)副作用,即在访问 class 成员时我无法检测到拼写错误,因为 myClass.complicatedObjectName=1 有效并且 myclass.complicatedObjectname=1 也有效,即使后一个变量从未定义。如图所示,当像这样公开 class 时

#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 上使用标准增强库 (v 1.54)。

在 python 中,您可以覆盖 _setattr_ 以仅允许定义列表中的属性名称。方法如下:

然后是一些如何在 C++ 中实现相同的想法:How to override __setattr__ in a wrapped class (from C++)? and Catch creation of instance attributes of boost::python-wrapped classes from c++