从C创建一个实现__dict__的Python类型?

Mat*_*ner 8 c python types python-c-api python-3.x

  • 如何创建一个类型,以便__dict__在Python中定义一个"普通"类?
  • 有没有__dict__s 的非动态类型的例子?
  • 通过Python定义的类型是否PyTypeObject通过type_new

有一个tp_dict成员PyTypeObject,但我找不到有关它如何使用的信息.此外,还似乎有什么东西在事情typeobject.ctype_new,但我不能清楚地破译它.

以下是我发现的一些相关信息:

小智 6

以下代码将生成一个__dict__在Python 2.x 中实现的类:

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);
}
Run Code Online (Sandbox Code Playgroud)

重要的一点是结构的tp_dictoffset成员PyTypeObject(http://docs.python.org/c-api/typeobj.html):

如果此类型的实例具有包含实例变量的字典,则此字段为非零并包含实例变量字典类型实例中的偏移量; PyObject_GenericGetAttr()使用此偏移量.

不要将此字段与tp_dict混淆; 这是类型对象本身的属性的字典.