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

Reply via email to