Доступ к себе из функции обратного вызова ctype в Python? - PullRequest
2 голосов
/ 25 октября 2011

Я хочу иметь возможность вызывать себя изнутри функции обратного вызова.

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 ]

3 голосов
/ 25 октября 2011

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>
0 голосов
/ 25 октября 2011

Ваша функция обратного вызова выглядит как функция C с прототипом:

void __stdcall Callback(uint32)

Вам не нужно делать ничего особенного, чтобы получить доступ к self. Магия ctypes организует это для вас. Код, который вам нужен, выглядит примерно так:

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)
0 голосов
/ 25 октября 2011
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))
...