On Saturday 14 January 2012 22:15:36 Daniel Franke wrote: > Here I'd expect "<class 'ca.ca'>" instead?! And I never managed a proper > subclass :|
Found an explanation on type/class at [1]: "he difference between the two is whether the C-level type instance structure is flagged as having been allocated on the heap or not" - hu? With this info, I went ahead and tried the code quoted below. Now I get: >>> import cmod >>> cmod.ca <type 'cmod.ca'> >>> cmod.cb <type 'cmod.cb'> >>> cmod.ca.__bases__ (<type 'object'>,) >>> cmod.cb.__bases__ (<type 'cmod.ca'>,) which seems to make sense besides the "type" instead of "class"?! What threw me is that I expected that I'd need to explicitly subclass the "object" type, from which I assumed for some reason I'd also inherit the .tp_new member. This is obviously not the case. Now the last question is, how do I get the a_type of Python class to use it as base for "cb"? On lives and learns. Daniel [1] http://utcc.utoronto.ca/~cks/space/blog/python/ClassesAndTypes -- #include <Python.h> typedef struct { PyObject_HEAD } ca; static PyTypeObject ca_Type = { PyObject_HEAD_INIT(NULL) }; typedef struct { PyObject_HEAD } cb; static PyTypeObject cb_Type = { PyObject_HEAD_INIT(NULL) }; PyMODINIT_FUNC initcmod(void) { PyObject *cmod; ca_Type.tp_name = "cmod.ca"; ca_Type.tp_basicsize = sizeof(ca); ca_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; ca_Type.tp_new = PyType_GenericNew; ca_Type.tp_base = &PyBaseObject_Type; if (PyType_Ready(&ca_Type) < 0) return; cb_Type.tp_name = "cmod.cb"; cb_Type.tp_basicsize = sizeof(cb); cb_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; cb_Type.tp_base = &ca_Type; if (PyType_Ready(&cb_Type) < 0) return; cmod = Py_InitModule3("cmod", NULL, "c module"); if (cmod == NULL) return; Py_INCREF(&ca_Type); PyModule_AddObject(cmod, "ca", (PyObject*)&ca_Type); Py_INCREF(&cb_Type); PyModule_AddObject(cmod, "cb", (PyObject*)&cb_Type); } -- http://mail.python.org/mailman/listinfo/python-list