defining class and subclass in C

Daniel Franke franke.daniel at gmail.com
Sat Jan 14 18:29:20 EST 2012


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);
}




More information about the Python-list mailing list