在我的 Python 应用程序中,我使用事件在不同插件之间进行通信。
现在,我想我可以使用装饰器来为我做这件事,而不是手动注册事件的方法。
我想让它看起来像这样:
@events.listento('event.name')
def myClassMethod(self, event):
...
我首先尝试这样做:
def listento(to):
def listen_(func):
myEventManager.listen(to, func)
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return func
return listen_
当我打电话时myEventManger.listen('event', self.method)
从实例内部来看,一切都运行良好。但是,如果我使用装饰器方法,self
争论从未被通过。
在网上搜索解决方案后,我尝试过的另一种方法是使用类作为装饰器:
class listen(object):
def __init__(self, method):
myEventManager.listen('frontend.route.register', self)
self._method = method
self._name = method.__name__
self._self = None
def __get__(self, instance, owner):
self._self = instance
return self
def __call__(self, *args, **kwargs):
return self._method(self._self, *args, **kwargs)
这种方法的问题是我不太理解这个概念__get__
,而且我不知道如何合并这些参数。
只是为了测试,我尝试使用固定事件来监听,但是使用这种方法,什么也没有发生。当我添加打印语句时,我可以看到__init__
叫做。
如果我添加额外的“旧式”事件注册,两者都会__get__
and__call__
尽管有新的装饰器,但事件仍然有效。
实现我正在寻找的目标的最佳方法是什么,或者我只是错过了装饰器的一些重要概念?