我正在编写一个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
...
它可以通过子类化服务器类和定义要调用的方法来工作。我怎样才能在函数字典中自动注册方法?
我认为可以做的一种方法是使用元类,如果找到匹配项,则查看方法名称中的模式添加,将该方法添加到函数字典中。这似乎有点过分......
是否可以装饰要注册的方法?有人能给我一个提示这个问题的最简单的解决方案吗?
答案 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做你想做的事。