我有一个班级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
方法等等 - 其余的工作我希望自己可以做。
答案 0 :(得分:4)
函数__getattr__
只适用于类实例,而不适用于类。请改用getattr(cls, method_name)
,它将解决问题。
getattr(cls, method_name)