在 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++。
我正在努力应对在 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 中,您可以覆盖 然后是一些如何在 C++ 中实现相同的想法:How to override __setattr__ in a wrapped class (from C++)? and Catch creation of instance attributes of boost::python-wrapped classes from c++。_setattr_
以仅允许定义列表中的属性名称。方法如下: