从Python中的ctype回调函数访问self?

时间:2011-10-25 15:19:04

标签: python callback ctypes

我希望能够从回调函数中调用self。

class MyClass():
    def myMethod(self):
        def myCallback(p1):
            print "Callback called!"
            # here I want to do something with self!

        CALLBACK_x = ctypes.WINFUNCTYPE(ctypes.c_void_p, ctypes.c_uint32)
        somedll.setCallback(CALLBACK_x(cbFileRefDone), 0)

不使用回调函数中的DWORD参数。

我如何访问自己?

3 个答案:

答案 0 :(得分:3)

self应该已在myCallback中提供。由于它是在函数内创建的,因此它可以访问封闭函数的变量,包括self。这些变量实际上与内部函数一起存储在所谓的闭包中,因此即使在封闭函数返回后它们仍然存在。这是一个最小的例子:

class C(object):
   def f(self):
     def g():
        print self
     return g

c = C()
g = c.f()
g()
>>> <__main__.C object at 0x02AED1F0>

答案 1 :(得分:0)

class MyClass():
    def myMethod(self):
        def myCallback(p1):
            self = ctypes.cast(p1, ctypes.py_object).value
            print "Callback called!"
            # here I want to do something with self!

        CALLBACK_x = ctypes.WINFUNCTYPE(ctypes.c_void_p, ctypes.c_uint32)
        somedll.setCallback(CALLBACK_x(cbFileRefDone), ctypes.py_object(self))

答案 2 :(得分:0)

您的回调函数似乎是带有原型的C函数:

void __stdcall Callback(uint32)

您无需执行任何特殊操作即可访问selfctypes魔法会为你安排。你需要的代码是这样的:

class MyClass():
    def myMethod(self):
        def myCallback(p1):
            print "Callback called!"
            # self is available here

        callback = ctypes.WINFUNCTYPE(ctypes.c_void_p, 
            ctypes.c_uint32)(myCallback)
        somedll.setCallback(callback, 0)