【发布时间】:2018-09-05 19:10:39
【问题描述】:
我有一个封装在 Python 类型中的 C++ 类 (Scenario):
struct PyScenario {
PyObject_HEAD
Scenario scen;
};
我想将Scenario 的一些私有成员公开给 Python 脚本——不使用显式的 getter/setter 函数:
static PyMemberDef scenarioMembers[] {
{
(char *)"a",
T_DOUBLE, offsetof(PyScenario, scen._a),
"The a"
},
{
(char *)"b",
T_INT, offsetof(PyScenario, scen._b),
"The b"
},
NULL
};
不幸的是,当我编译上面的代码时,我收到一个错误,例如:'double Scenario::_a' is private within this context。
我不想公开_a 和_b,所以我尝试将PyMemberDef 声明为friend 的Scenario:
class Scenario {
#ifdef PY_MAJOR_VERSION
friend struct PyMemberDef;
#endif
private:
double _a;
int _b;
....
};
很遗憾,这并没有帮助...正确的方法是什么?
【问题讨论】:
-
“我想将 Scenario 的一些私有成员暴露给 Python 脚本——不使用显式的 getter/setter 函数:” - 为什么?为什么不想使用 getter 函数从对象中获取数据?这对我来说毫无意义。
-
@JesperJuhl:大概他们正试图利用
PyMemberDef为它们生成简单值的访问器的能力,而不是必须编写自定义函数以用于更复杂的/强大的PyGetSetDef访问器方法。 CPython 大多是 C++ 盲的,所以它不能直接使用成员函数,这意味着他们必须编写包装器来调用成员函数。 -
谢谢你,@ShadowRanger。没错 - 我想要直接访问标准标量类型字段的速度和简单性,是的。
-
@MikhailT.:我会注意,虽然写
GetSet描述符与Member相比显然更复杂,但在速度方面,它们应该大致相当;Members 只是为您编写访问器函数的描述符的一个特例;它们通常不会更快(除非可能是由于使用共享热代码路径的意外)。
标签: python c++ python-3.x c++11 c++14