Python C++ API将成员设为私有

0lvr5msh  于 2022-12-05  发布在  Python
关注(0)|答案(1)|浏览(109)

我正在用我的C代码做一个python扩展模块,我已经做了一个用来传递C变量的struct。我希望其中一些变量在python级别是不可访问的。我该怎么做呢?

typedef struct {
        PyObject_HEAD
        std::string region;
        std::string stream;

        bool m_is_surface = false;
        bool m_is_stream = false;
    } PyType;

我希望用户不能访问m_is_surfacem_is_stream。只有PyType的方法可以访问它。因此,和用户不能做如下操作:

import my_module

instance = my_module.PyType()
instance.m_is_surface = False # This should raise an error. Or preferably the user can't see this at all

我不能直接将private添加到struct中,因为python类型成员是作为一个独立函数创建的,并且稍后会链接到该类型,所以我不能在struct的方法中访问它们。因此,如果我说:

int PyType_init(PyType *self, PyObject *args, PyObject *kwds)
    {
        static char *kwlist[] = {"thread", "region", "stream", NULL};
        PyObject *tmp;

        if (!PyArg_ParseTupleAndKeywords(args, kwds, "bs|s", kwlist,
                                        &self->thread, &self->region, &self->stream))
            return -1;
        
        return 0;
    }

它将引发is private within this context错误。

p4tfgftt

p4tfgftt1#

你不应该做任何事情。除非你创建一个访问器属性,否则这些属性 * 已经 * 无法从Python访问。Python不能自动看到C/C++结构成员。

相关问题