Mat*_*ner 8 c python types python-c-api python-3.x
__dict__在Python中定义一个"普通"类?__dict__s 的非动态类型的例子?PyTypeObject通过type_new?有一个tp_dict成员PyTypeObject,但我找不到有关它如何使用的信息.此外,还似乎有什么东西在事情typeobject.c的type_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混淆; 这是类型对象本身的属性的字典.