文章目录
- 1. 形式一:使用if else,判断不同情况
- 2.形式二:封装方法,将方法放到字典里面判断不同情况
- 3.形式三:利用装饰器,模拟事件驱动的情况
- 4.形式四:基于形式三的一种优化 - 仅会执行最匹配事件消息的驱动方法
- 5.形式四:基于形式四的一种变化 - 类似于消息的订阅和发布(匹配的订阅方法都会执行,而不是仅执行匹配度最高的方法。)
1. 形式一:使用if else,判断不同情况
def func(var):
if var == "a":
print("执行情况a")
elif var == "b":
print("执行情况b")
elif var == "c":
print("执行行情况c")
elif var == "d":
print("执行行情况d")
func(var="a")
func(var="b")
func(var="c")
func(var="d")
2.形式二:封装方法,将方法放到字典里面判断不同情况
这种方法易于理解,但它有一个缺点,即字典的键必须是可哈希的,因此不能使用像列表或字典这样的变量作为事件消息。
def func_var_a():
print("执行情况a")
def func_var_b():
print("执行情况b")
def func_var_c():
print("执行情况c")
def func_var_d():
print("执行情况d")
event = {"a": func_var_a, "b": func_var_b, "c": func_var_c, "d": func_var_d}
def trigger(var):
event[var]()
trigger(var='a')
trigger(var='b')
trigger(var='c')
trigger(var='d')
3.形式三:利用装饰器,模拟事件驱动的情况
相较于第二种形式,使用了装饰器,虽然增加了代码复杂性,但我认为这样做更有利于开发人员整理逻辑。然而,与第二种方法相同,它也无法处理像列表或字典这样的变量作为事件消息。
class EventDispatcher:
def __init__(self):
self._events = {}
def register_event(self, var):
def decorator(func):
self._events[var] = func
return decorator
def run(self, var):
self._events[var]()
eventdispatcher = EventDispatcher()
@eventdispatcher.register_event("a")
def func_var_a():
print("执行情况a")
@eventdispatcher.register_event("b")
def func_var_b():
print("执行情况b")
@eventdispatcher.register_event("c")
def func_var_c():
print("执行情况c")
@eventdispatcher.register_event("d")
def func_var_d():
print("执行情况d")
if __name__ == '__main__':
eventdispatcher.run(var='a')
eventdispatcher.run(var='b')
eventdispatcher.run(var='c')
eventdispatcher.run(var='d')
4.形式四:基于形式三的一种优化 - 仅会执行最匹配事件消息的驱动方法
通过使用内置函数frozenset,可以将可变集合转换为可哈希的对象,从而克服了无法使用列表或字典等变量作为事件消息的限制。这种方法仅会执行最匹配事件消息的驱动方法。
class EventDispatcher:
def __init__(self):
self._event = {}
def register_event(self, event_name):
def wrapper(func):
self._event[frozenset(event_name.items())] = func
return wrapper
def trigger_event(self, event_name):
func_arr = []
for subscription_key in self._event.keys():
if all(sub_key in frozenset(event_name.items()) for sub_key in subscription_key):
func_arr.append(subscription_key)
if len(func_arr):
return [max(func_arr, key=len)]
return []
# return func_arr
def run(self, event_name, *args, **kwargs):
func = self.trigger_event(event_name=event_name)
for f in func:
self._event[f](*args, **kwargs)
eventdispatcher = EventDispatcher()
@eventdispatcher.register_event({"var_1": "a", "var_2": "b", "var_3": "c"})
def func_var_1():
print("执行情况a,b,c")
@eventdispatcher.register_event({"var_1": "a", "var_2": "b"})
def func_var_2():
print("执行情况a,b")
@eventdispatcher.register_event({"var_1": "a"})
def func_var_2():
print("执行情况a")
if __name__ == '__main__':
eventdispatcher.run(event_name={"var_1": "a", "other_key": "other_infos"})
eventdispatcher.run(event_name={"var_1": "a", "var_2": "b", "other_key": "other_infos"})
eventdispatcher.run(event_name={"var_1": "a", "var_2": "b", "var_3": "c", "other_key": "other_infos"})
5.形式四:基于形式四的一种变化 - 类似于消息的订阅和发布(匹配的订阅方法都会执行,而不是仅执行匹配度最高的方法。)
这个方法会在发布的消息中寻找匹配的订阅方法并执行,而不是仅执行匹配度最高的方法。
class EventDispatcher:
def __init__(self):
self._event = {}
def register_event(self, event_name):
def wrapper(func):
self._event[frozenset(event_name.items())] = func
return wrapper
def trigger_event(self, event_name):
func_arr = []
for subscription_key in self._event.keys():
if all(sub_key in frozenset(event_name.items()) for sub_key in subscription_key):
func_arr.append(subscription_key)
# if len(func_arr):
# return [max(func_arr, key=len)]
# return []
return func_arr
def run(self, event_name, *args, **kwargs):
func = self.trigger_event(event_name=event_name)
for f in func:
self._event[f](*args, **kwargs)
eventdispatcher = EventDispatcher()
@eventdispatcher.register_event({"var_1": "a", "var_2": "b", "var_3": "c"})
def func_var_1():
print("执行情况a,b,c")
@eventdispatcher.register_event({"var_1": "a", "var_2": "b"})
def func_var_2():
print("执行情况a,b")
@eventdispatcher.register_event({"var_1": "a"})
def func_var_2():
print("执行情况a")
if __name__ == '__main__':
eventdispatcher.run(event_name={"var_1": "a", "var_2": "b", "var_3": "c", "other_key": "other_infos"})
标签:订阅,name,python,self,事件驱动,func,var,event,def
From: https://blog.csdn.net/qq_29371275/article/details/139124049