给定一个方法名称作为字符串,如何获取方法实例?

时间:2014-01-23 09:49:15

标签: python python-2.7 methods wrapper

我有一个班级Client,它有很多方法:

class Client:
    def compute(self, arg):
          #code
    #more methods

此类的所有方法都以同步方式运行。我想以异步方式运行它们 。实现这一目标的方法太多了。但我正在考虑这些问题:

AsyncClient = make_async(Client) #make all methods of Client async, etc!

client = AsyncClient()           #create an instance of AsyncClient

client.async_compute(arg)        #compute asynchronously
client.compute(arg)              #synchronous method should still exist!

好吧,这看起来太雄心勃勃了,我觉得可以做到。

到目前为止,我写过:

def make_async(cls):

     class async_cls(cls):  #derive from the given class

         def __getattr__(self, attr):
               for i in dir(cls):
                   if ("async_" + i) == attr:
                         #THE PROBLEM IS HERE
                         #how to get the method with name <i>?
                         return cls.__getattr__(i) # DOES NOT WORK

     return async_cls

正如您在上面的代码中看到的注释,问题是获取方法名称为字符串。怎么做?一旦我得到了这个方法,我会把它包装在async_caller方法等等 - 其余的工作我希望自己可以做。

1 个答案:

答案 0 :(得分:4)

函数__getattr__只适用于类实例,而不适用于类。请改用getattr(cls, method_name),它将解决问题。

getattr(cls, method_name)