一个相对简单的解决方案是可能的。我们首先使用装饰器来标记函数。当实例被构造时,我们搜索这些标记并注册回调。
更具体地说,标记和重新捕获模式的工作原理是使用装饰器在绑定之前标记函数,然后在构造函数中实例的绑定方法中找到它。
首先,我们使用装饰器来进行标记(我们使用一个集合来允许在一个方法上进行多个标记):
def callback(*args):
def decorate(f):
try:
f._marks.add(args)
except AttributeError:
f._marks = {args}
return f
return decorate
然后我们使用检查模块找到标记函数的绑定版本,并将它们连接起来:
def connect_callbacks(obj):
for _, f in inspect.getmembers(obj, inspect.ismethod):
try:
marks = f.__func__._marks
except AttributeError:
continue
for widget, signal in marks:
widget.connect(signal, f)
__func__
是原始未绑定函数的名称。这使我们能够访问之前应用的标记,从而方便我们夺回.
然后我们可以简单地创建我们的类并装饰我们的函数,记住在构造函数中连接我们的回调:
class Test:
def __init__(self):
...
connect_callbacks(self)
@callback(widget, signal)
def test():
...
这允许我们将绑定方法与装饰器连接起来。
编辑:我在 github 上发布了一个小型库,可以为您完成此操作 - 它称为recap.