Implementing class methods in C

N

nmichaud

I am having a problem implementing some methods of a python class in C.
The class is defined in python, but I would like to rewrite some methods
in c. Here is an example of what I want to do:

file _test.c:

#include <Python.h>

static PyObject *
func2(PyObject *self, PyObject *args)
{
if (self == NULL) {
PyErr_SetString(PyExc_SystemError, "self is NULL");
return NULL;
}

// Parse arguments
if (!PyArg_ParseTuple(args, ""))
{
return NULL;
}

Py_INCREF(Py_None);
return Py_None;
}

static PyMethodDef TestMethods[] = {
{"func2", func2, METH_VARARGS, "func2."},
{NULL, NULL, 0, NULL} /* Sentinel */
};

PyMODINIT_FUNC
init_test(void)
{
(void) Py_InitModule("_test", TestMethods);
}

----------------------------------------------------
test.py:

class Test:
def func1(self):
print "I am in func 1"

import _test
import new
Test.func2 = new.instancemethod(_test.func2, None, Test)
del(new)

t = Test()
t.func2()


When I run test.py, I get a SystemError exception (which is what I raise
if self is NULL). I think my confusion lies in the use of PyObject* self
in the function declaration. Shouldn't this be set to point to the
instance of class Test that I am calling it from? Am I misunderstanding
the purpose of PyObject* self? Thanks.

Naveen
 
B

BranoZ

Am I misunderstanding the purpose of PyObject* self?

No. I think you do everything right, but it still doesn't work.

I have tried to implement it in Python:
----------------------------------------------------
_test.py:

def func2(self, *args):
print type(self)
print args

then all of this works:
----------------------------------------------------

import _test

class Test1:
func2 = _test.func2

class Test2:
pass

Test2.func2 = _test.func2

class Test3:
pass

import new
Test3.func2 = new.instancemethod(_test.func2, None, Test3)
del new

Test1().func2(1, 2, 3)
Test2().func2(1, 2, 3)
Test3().func2(1, 2, 3)

If you implement _test in C, works none of the above.
The only difference I can see is that:

type(_test.func2)
<type 'function'>
is for Python implemented function and

type(_test.func2)
<type 'builtin_function_or_method'>
for C implementation

I would really like to know the answer too.
How do you implement some methods in C without subclassing ?

BranoZ
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,967
Messages
2,570,148
Members
46,694
Latest member
LetaCadwal

Latest Threads

Top