Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python,在方法定义处执行额外代码_Python_Oop_Decorator_Metaclass - Fatal编程技术网

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

Python,在方法定义处执行额外代码,python,oop,decorator,metaclass,Python,Oop,Decorator,Metaclass,我正在编写一个pythonapi/服务器,允许外部设备微控制器通过发送带有方法名称的字符串远程调用对象的方法。这些方法将存储在字典中。e、 g: class Server: ... functions = {} def register(self, func): self.functions[func.__name__] = func def call(self, func_name, args): self.functions[f

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

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
    ...
它将通过对服务器类进行子类化和定义要调用的方法来工作。如何使方法自动注册到函数字典中

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


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

没有必要构建字典,只需使用:

Python实际上使用一个字典来访问对象上的属性,不管怎样,它被称为_dict__,-但是使用getattr比直接访问要好

如果出于某种原因,您真的想构建该dict,请查看:


如果您想选择特定的方法,可以使用装饰器来完成,但是正如BrenBarn指出的,在装饰方法时实例并不存在,因此您需要使用来完成您想要的操作。

您的元类解决方案也可以使用类装饰器来完成。方法上的装饰器将无法在类上存储任何内容,因为在方法装饰器运行时该类还不存在。@BrenBarn确实存在。@Lattyware:当然,我只是说除了方法上的装饰器之外,您还需要一些机器。实际上,这是一种更好的方法。但是,我如何打印MyServer中定义的方法列表,而不将它们存储在列表中并在该列表上迭代?@Speccy如果您想要所有方法的列表,请查看inspect.getmembers,这是我回答的下半部分。
   def call(self, func_name, args):
        getattr(self, func_name)(*args)
def __init__(self, ...):
    self.functions = dict(inspect.getmembers(self, inspect.ismethod))