如何用C ++在Python中定义静态类属性?

时间:2017-09-09 16:59:01

标签: python c++

我想知道如何从C ++为Python定义静态类变量?等效的Python代码就像:

class foo:
    bar = int

我在定义类型时尝试使用tp_getset字段,但事实证明它不起作用并在Python中返回getset_descriptor,并且在实例上调用时它不起作用(AttributeError)。此外,Python doc说使用C API直接操作tp_dict是不安全的。但它并没有告诉使用什么。 (见 here

我故意在示例中选择了int,因为我引用了其他一些类,如果这很重要。

1 个答案:

答案 0 :(得分:0)

tp_getset为类型定义descriptors;描述符在通过__getattribute__钩子访问时绑定到实例,因此不适合定义类属性。

您可以通过在类型的PyTypeObject.tp_dict object上设置属性来为类添加属性;在模块的初始化函数(PyInit_<modulename>)中执行此操作,例如,在使用PyType_Ready()完成类型后(确保tp_dict对象存在):

PyObject *d;
PyObject *bar;

d = PyFoo_Type.tp_dict;

bar = PyLong_FromLong(42);
if (bar == NULL || PyDict_SetItemString(d, "bar", bar) < 0)
    return NULL;
Py_DECREF(bar);

这是未经测试的C代码;我不熟悉C ++,而是自信地为您提供C ++版本。

如果您想查看真实示例,请参阅datetime module,其中设置了datetime.mindatetime.max等类属性。