- 如何创建一个类型以具有
__dict__
按照“正常”类的说法,它是在 Python 中定义的吗?
- 是否有任何非动态类型的示例
__dict__
s?
- 通过 Python 定义类型通过?
有一个tp_dict
成员PyTypeObject
,但我找不到有关如何使用它的信息。似乎也发生了一些事情typeobject.c
's type_new
但我无法清楚地解读它。
以下是我找到的一些相关信息:
- __dict__在从 C 扩展模块继承的类中 http://www.velocityreviews.com/forums/t357472-__dict__-in-class-inherited-from-c-extension-module.html
- Python 中 __slots__ 是如何实现的? https://stackoverflow.com/q/5057845/149482
以下代码将生成一个实现了__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);
}
重要的是tp_dictoffset
的成员PyTypeObject
结构体(http://docs.python.org/c-api/typeobj.html http://docs.python.org/c-api/typeobj.html):
如果该类型的实例有一个包含实例的字典
变量,该字段非零并且包含偏移量
实例变量字典类型的实例;这个偏移量
由 PyObject_GenericGetAttr() 使用。
不要将此字段与 tp_dict 混淆;那是字典
类型对象本身的属性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)