Re: Implementing class methods in C
> If you implement _test in C, works none of the above. > The only difference I can see is that: > type(_test.func2) > > is for Python implemented function and > type(_test.func2) > > for C implementation > I would really like to know the answer too. > How do you implement some methods in C without subclassing ? But the strange thing is if I use new.instancemethod the c function becomes bound (using my previous code for _test.c) import _test class Test: def func1(self): print "In class "+repr(self.__class__.__namd__) import new Test.func2 = new.instancemethod(_test.func2, None, Test) del new t = Test type(_test.func2) # returns type(T.func1) # returns type(t.func1) # returns > type(T.func2) # returns type(t.func2) # returns > So is seems like it is bound appropriately, but when called across the C/Python api the first argument (self) of func2 is not separated from the other arguments (and thus is not sent into the c function as PyObject* self, but instead as part of PyObject* args) -- http://mail.python.org/mailman/listinfo/python-list
Re: Implementing class methods in C
Nope, it still doesn't work. Anyway, that's not exactly what i want, since i want func2 to be accessible from all instances of Test() Naveen On Thu, 18 Aug 2005, Jeremy Moles wrote: > I honestly don't know the answer to this and I am entirely guessing > but--does it work without using the new module? That is: > > > > import _test > > class Foo: > pass > > foo = Foo() > > foo.bar = _test.func2 > > foo.bar() > > On Thu, 2005-08-18 at 12:09 -0400, [EMAIL PROTECTED] wrote: > > 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 > > > > 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 > > > > - > > Naveen Michaud-Agrawal > > Program in Molecular Biophysics > > Johns Hopkins University > > (410) 614 4435 > -- http://mail.python.org/mailman/listinfo/python-list
Implementing class methods in C
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 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 - Naveen Michaud-Agrawal Program in Molecular Biophysics Johns Hopkins University (410) 614 4435 -- http://mail.python.org/mailman/listinfo/python-list
Implementing class methods in C
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 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 - Naveen Michaud-Agrawal Program in Molecular Biophysics Johns Hopkins University (410) 614 4435 -- http://mail.python.org/mailman/listinfo/python-list