Python,在方法定义中执行额外的代码

时间:2013-11-20 21:37:47

标签: python oop decorator metaclass

我正在编写一个python API /服务器,允许外部设备(微控制器)通过发送带有方法名称的字符串来远程调用对象的方法。这些方法将存储在字典中。例如:

class Server:
    ...
    functions = {}
    def register(self, func):
        self.functions[func.__name__] = func
    def call(self, func_name, args):
        self.functions[func_name](*args)
    ...

我知道我可以在类定义外部定义函数并手动注册它们,但我真的希望注册步骤会自动完成。考虑以下课程:

class MyServer(Server):
    ...
    def add(self,a,b):
        print a+b
    def sub(self,a,b):
        print a-b
    ...

它可以通过子类化服务器类和定义要调用的方法来工作。我怎样才能在函数字典中自动注册方法?

我认为可以做的一种方法是使用元类,如果找到匹配项,则查看方法名称中的模式添加,将该方法添加到函数字典中。这似乎有点过分......

是否可以装饰要注册的方法?有人能给我一个提示这个问题的最简单的解决方案吗?

1 个答案:

答案 0 :(得分:0)

无需构建字典,只需使用the getattr() built-in function

   def call(self, func_name, args):
        getattr(self, func_name)(*args)

Python实际上使用字典来访问对象上的属性(它被称为__dict__, - 但使用getattr()比直接访问它更好。)

如果您真的想出于某种原因构建该词典,请查看the inspect module

def __init__(self, ...):
    self.functions = dict(inspect.getmembers(self, inspect.ismethod))

如果你想选择特定的方法,你可以使用装饰器来做到这一点,但正如BrenBarn指出的那样,在装饰方法时实例不存在,所以你需要使用the mark and recapture technique做你想做的事。