如何使用装饰器将方法添加到字典中?

时间:2018-12-14 05:50:09

标签: python decorator

我想要的是类似烧瓶路由寄存器的东西:

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")无效。

2 个答案:

答案 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