Implementing class methods in C

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • nmichaud@jhu.edu

    #1

    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 <Python.h>

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

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

    Py_INCREF(Py_No ne);
    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.instancemet hod(_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 misunderstandin g
    the purpose of PyObject* self? Thanks.

    Naveen

    ---------------------------------------------------------------------
    Naveen Michaud-Agrawal
    Program in Molecular Biophysics
    Johns Hopkins University
    (410) 614 4435
  • BranoZ

    #2
    Re: Implementing class methods in C

    nmichaud@jhu.ed u wrote:[color=blue]
    > Am I misunderstandin g the purpose of PyObject* self?[/color]

    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.instancemet hod(_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.func 2)
    <type 'function'>
    is for Python implemented function and

    type(_test.func 2)
    <type 'builtin_functi on_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

    Comment

    Working...