我想知道如何从C ++为Python定义静态类变量?等效的Python代码就像:
class foo:
bar = int
我在定义类型时尝试使用tp_getset字段,但事实证明它不起作用并在Python中返回getset_descriptor
,并且在实例上调用时它不起作用(AttributeError)。此外,Python doc说使用C API直接操作tp_dict
是不安全的。但它并没有告诉使用什么。 (见 here)
我故意在示例中选择了int
,因为我引用了其他一些类,如果这很重要。
答案 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.min
,datetime.max
等类属性。