CPython-向包含_dict的新类型添加属性__

CPython-向包含_dict的新类型添加属性__,python,attributes,cpython,Python,Attributes,Cpython,我知道您可以通过以下方式添加可写成员: 结构PyMemberDef*PyTypeObject.tp_成员 但我不想将自己局限于特定数量的属性。因此,根据Andrew Floren的解决方案,我创建了一个具有\uuu dict\uuu的对象: 我现在可以在Python中添加属性,但是如果我想在C中添加属性呢? 如何使用C中的\uuu dict\uuu向对象添加属性 PyObject与uuu dict\uuuuu… typedef struct { PyObject_HEAD PyObjec

我知道您可以通过以下方式添加可写成员:

结构PyMemberDef*PyTypeObject.tp_成员

但我不想将自己局限于特定数量的属性。因此,根据Andrew Floren的解决方案,我创建了一个具有\uuu dict\uuu的对象:

我现在可以在Python中添加属性,但是如果我想在C中添加属性呢? 如何使用C中的\uuu dict\uuu向对象添加属性

PyObject与uuu dict\uuuuu…

typedef struct {
  PyObject_HEAD
  PyObject* dict;
} BarObject;

static PyTypeObject BarObject_Type = {
  PyObject_HEAD_INIT(NULL)
};

PyMODINIT_FUNC
initFoo(void)
{
  PyObject *m;

  m = Py_InitModule("Foo", NULL);
  if (m == NULL)
    return;

  BarObject_Type.tp_new = PyType_GenericNew;
  BarObject_Type.tp_name = "Foo.Bar";
  BarObject_Type.tp_basicsize = sizeof(BarObject);
  BarObject_Type.tp_getattro = PyObject_GenericGetAttr;
  BarObject_Type.tp_setattro = PyObject_GenericSetAttr;
  BarObject_Type.tp_flags = Py_TPFLAGS_DEFAULT;
  BarObject_Type.tp_dictoffset = offsetof(BarObject,dict);
  BarObject_Type.tp_doc = "Doc string for class Bar in module Foo.";
  if (PyType_Ready(&BarObject_Type) < 0)
    return;

  Py_INCREF(&BarObject_Type);
  PyModule_AddObject(m, "Bar", (PyObject*)&BarObject_Type);
}
typedef结构{
皮尤头
PyObject*dict;
}BarObject;
静态PyTypeObject BarObject\u类型={
PyObject\u HEAD\u INIT(空)
};
PyMODINIT_FUNC
initFoo(无效)
{
PyObject*m;
m=Py_InitModule(“Foo”,NULL);
如果(m==NULL)
返回;
BarObject_Type.tp_new=PyType_GenericNew;
BarObject_Type.tp_name=“Foo.Bar”;
BarObject_Type.tp_basicsize=sizeof(BarObject);
BarObject_Type.tp_getattro=PyObject_GenericGetAttr;
BAROObject_Type.tp_setattro=PyObject_GenericSetAttr;
BarObject_Type.tp_flags=Py_TPFLAGS_默认值;
BarObject\U Type.tp\U dictoffset=偏移量(BarObject,dict);
BarObject_Type.tp_doc=“模块Foo中类栏的文档字符串。”;
if(PyType_就绪(&BAROObject_类型)<0)
返回;
Py_增量(和BarObject_类型);
PyModule_AddObject(m,“Bar”,(PyObject*)和BarObject_类型);
}
解决方案: 基本上,dict偏移量必须是dict类型的PyObject

BarObject *bar = PyObject_New(BarObject, &BarObject_Type);
bar->dict = PyDict_New();
PyObject_SetAttrString((PyObject*)bar, "none", Py_None);
解决方案: 基本上,dict偏移量必须是dict类型的PyObject

BarObject *bar = PyObject_New(BarObject, &BarObject_Type);
bar->dict = PyDict_New();
PyObject_SetAttrString((PyObject*)bar, "none", Py_None);

但是由于某些原因,“none”没有出现在dir(bar)中。为什么?请补充一些解释。传授底层逻辑比仅仅给出代码更重要,因为它有助于OP和其他读者自己解决此问题和类似问题,但出于某种原因,“无”不会出现在dir(条形图)中。为什么?请补充一些解释。传授底层逻辑比仅仅给出代码更重要,因为它可以帮助OP和其他读者自己解决这个问题和类似的问题