我想要的是类似烧瓶路由寄存器的东西:
class ClassName(object):
def __init__(self):
self.handle_dict = {}
def handle(data):
h = self.handle_dict.get(data)
h()
@handle_route("open")
def open_handle()
"""do something"""
pass
@handle_route("close")
def close_handle()
"""do something"""
pass
def handle_route()
"""How to implement this warpper?"""
我知道我可以在__init__
函数中写一个字典:
self.handle_dict = {“打开”:self.open_handle,“关闭”:self.colse_handle}
但是装饰器的方式看起来更清晰,对吧?
我尝试过
def handle_router(self, path):
def warpper(f):
self.handle_map[path] = f
return f
return warpper
但是装饰器参数中不允许self
,@handle_router(self, "path")
无效。
答案 0 :(得分:1)
实际上,handle dict应该是某种类的属性,因为它是在类定义时填充的,并且所有实例共享相同的路由处理程序映射。但是,在调用和评估装饰器时,该类尚不存在。您可以执行以下操作:
from functools import partial
class A:
router = {}
def handle(self, data):
m = self.router.get(data)
return m(self)
@partial(router.setdefault, 'open')
def open_handle(self):
return 5
>>> a = A()
>>> a.handle('open')
5
或更明确地说,将路由功能提取到可重用的类中:
from functools import partial
class Router(dict):
__call__ = lambda self, route: partial(self.setdefault, route)
class A:
router = Router()
def handle(self, data):
m = self.router.get(data)
return m(self)
@router('open')
def open_handle(self):
return 5
答案 1 :(得分:0)
代替装饰功能,您可以使用一致的命名约定:
class ClassName(object):
def handle(self, type):
getattr(self, '{}_handle'.format(type))()
def open_handle(self):
print('open_handle')
def close_handle(self):
print('close_handle')
ClassName().handle('open')
>>> open_handle