这是我快速编写的一个简单的基于类的解决方案:
class Event:
def __init__(self):
# Initialise a list of listeners
self.__listeners = []
# Define a getter for the 'on' property which returns the decorator.
@property
def on(self):
# A declorator to run addListener on the input function.
def wrapper(func):
self.addListener(func)
return func
return wrapper
# Add and remove functions from the list of listeners.
def addListener(self,func):
if func in self.__listeners: return
self.__listeners.append(func)
def removeListener(self,func):
if func not in self.__listeners: return
self.__listeners.remove(func)
# Trigger events.
def trigger(self,args = []):
# Run all the functions that are saved.
for func in self.__listeners: func(*args)
它允许您创建一个Event,函数可以“订阅”到:
evn = Event()
# Some code...
evn.trigger(['arg x','arg y'])
这些函数都可以使用装饰器订阅事件:
@evn.on
def some_function(x,y): pass
或者使用 addListener 方法:
def some_function(x,y): pass
evn.addListener(some_function)
您还可以删除侦听器:
evn.removeListener(some_function)
要创建类似于您要求的内容,您可以执行以下操作:
# some.py
from event import Event
class SomeClass:
def __init__(self):
# Private event variable
self.__event = Event()
# Public event variable (decorator)
self.event = self.__event.on
some = SomeClass()
然后像这样使用它:
# main.py
from some import some
@some.event
async def on_ready(some_info):
print(some_info)
@some.event
async def on_error(err):
print(err)