I am working on a C extension module that implements a bunch of classes. Everything
works fine so far, but I cannot find any way to implement class attributes or inner
classes. Consider you have the following lines of Python :
class Foo : class Bar : pass
spam = "foobar"
How can this class be translated to a C extension? Is there anything comparable to
PyMethodDef that can be used for other attributes than functions?
O.k. I found it out now, and in order to improve the knwoledge base of the mailing
list, I will answer my question myself.
The PyTypeObject structure has a field tp_dict that holds the dictionary of the
class object. You can initialize it with a dictionary that holds class attributes.
If you provide a custom dictiomary, you must do so _before_ PyType_Ready() is called,
because PyType_Ready adds other entries to this dictionary.
This is my C extension of the above. It works great for me:
static PyTypeObject FooType = { /* ... snip ... */ 0, // tp_dict /* ... snip ... */ };
static PyTypeObject FooBarType = { /* ... snip ... */ };
PyMODINIT_FUNC inithyper(void)
{
/*
the following lines add class attributes to the types tp_dict:
*/
FooType.tp_dict = PyDict_New();
PyDict_SetItemString(FooBarType,"Bar",(PyObject *)&FooBarType);
PyDict_SetItemString(FooBarType,"spam",PyString_FromString("foobar"));
PyObject* m; if (PyType_Ready(&hFooType) < 0) return; if (PyType_Ready(&hFooBarType) < 0) return;
m = Py_InitModule3("my_module", NULL, "some documentation");
Py_INCREF(&FooType); PyModule_AddObject(m, "Foo", (PyObject *)&FooType);
Py_INCREF(&hyper_FooBarType); PyModule_AddObject(m, "Bar", (PyObject *)&FooBarType); }
Documentation for tp_dict can be found in the API: http://docs.python.org/api/type-structs.html
- harold -
-- "2x2 = grün" -- Heinz von Foerster
-- http://mail.python.org/mailman/listinfo/python-list