2012-10-01 49 views
0

我想在python中创建一个对象,其中对其下的任何方法的调用将被路由到单个方法实现。此外,此单一方法中的代码应使用调用的方法名称或其返回值。通用方法中的动态方法名称意识

例如,调用其下的任何方法名称的对象将打印方法名称。

>>> the_object.a_made_up_method() 
You have called method "a_made_up_method" 

(顺便说一句,如果Mock能帮上忙,我所有的话)

+0

你知道python装饰器吗? – wim

+1

@wim - 装饰器是否需要实现来装饰?在我的情况下,我想避免实现这个对象可能接收的所有各种方法调用,并建立一个替代所有这些对象的通用方法。 – Jonathan

+0

对不起,我错误地理解了你的问题。 – wim

回答

4

也许像

class My(): 
    def __getattr__(self, name): 
     def method(): 
      print 'You have called method "{}"'.format(name) 
     return method 

>>> a = My() 

>>> a.a_made_up_method() 
You have called method "a_made_up_method" 

这里的一个又一个,似乎与*args**kwargs工作:

class My(): 
    def __getattr__(self, name): 
     return self.method(name) 
    def method(self, name): 
     def dostuff(*args, **kwargs): 
      print "I'm called as {}!".format(name) 
      print args, kwargs 
     return dostuff 
+0

'* args,** kwargs'如何适合这里? – Jonathan

+0

另外,如果'method'中存在阻塞组件并且'name'在阻塞组件之前和之后的使用,这是否会承受同时发生的多线程调用?请注意,每个电话可能有不同的'名称... ... – Jonathan

+0

@Jonathan我不认为我可以回答我的头顶: - \我真的在我发布的代码中困惑我是,我不能甚至在'method'内使用'self'和'name'相同的方式。 –