Python:从callb访问object属性

2024-04-24 13:32:21 发布

您现在位置:Python中文网/ 问答频道 /正文

在 我正在尝试用回调函数来设计类,它被传输到某个C库中。需要在不更改回调参数的情况下授予对此类对象的访问权限。怎么做?在

from ctypes import *
...
lib = CDLL('mylibname.so')
    ...
    class A(object):
        def __init__(self):
            CALLBACK = CFUNCTYPE(c_uint32, c_void_p)
            self.callback_func = CALLBACK(A.message_callback)
            self.param = None
        def message_callback(data):
            ... #here need access to self.param
            return 0
        def set_param(self, param):
            self.param = param
    ...
    a = A()
    lib.lib_func(param1, param2, a.callback_func)

编辑: 我用包装器函数更改了类中的回调方法:

^{pr2}$

它在python2中工作,但我仍然对python3有问题:

回溯(最近一次呼叫): “调用回调函数”中第260行中的文件“_ctypes/callbacks.c” TypeError:“LP\u struct”对象不可调用

以下是同一问题的链接:Weird bug?


Tags: 对象函数fromself权限message参数param
1条回答
网友
1楼 · 发布于 2024-04-24 13:32:21

只需定义message_callback(self, data)并使用self.callback_func = A.CALLBACK(self.message_callback)。注意我使用了A.CALLBACK。将其设置为类属性。为每个实例定义它是浪费时间。在

例如:

C:

typedef int (*callback_t)(void *data);

int test(const char *data, callback_t f) {
    f((void *)data); 
    return 0;
}

Python:

^{pr2}$

演示:

>>> lib = CDLL('./lib.so')
>>> a = A()
>>> lib.test.argtypes = [c_char_p, A.CALLBACK]
>>> lib.test("updated", a.callback_func)
0
>>> a.param
'updated'

相关问题 更多 >