Python的等价物__call()魔法?

问题描述:

在PHP中,我可以做这样的事情:Python的等价物__call()魔法?

class MyClass 
{ 
    function __call($name, $args) 
    { 
    print('you tried to call a the method named: ' . $name); 
    } 
} 
$Obj = new MyClass(); 
$Obj->nonexistant_method(); // prints "you tried to call a method named: nonexistant_method" 

这将是很方便的能够在Python的一个项目我正在做的(很多讨厌的XML的解析,它会是很高兴把它变成对象,并能够只是调用方法。

确实Python中有相当的?

在你的对象上定义一个__getattr__方法,并从中返回一个函数(或闭包)。

In [1]: class A: 
    ...:  def __getattr__(self, name): 
    ...:   def function(): 
    ...:    print("You tried to call a method named: %s" % name) 
    ...:   return function 
    ...:  
    ...:  

In [2]: a = A() 

In [3]: a.test() 
You tried to call a method named: test 
+0

很不错,尽管定义嵌套函数为'function(* args)'也是有用的,这样主体可以使用函数名和任何传递的参数。取决于Keith想要的方法。 (当然,如果不会有任何方法的参数,'__getattr__'本身可以返回结果,从而模拟字段而不是方法。) – 2010-09-03 18:16:33

+0

我确实希望能够获得函数参数为好。定义def函数()是唯一必要的改变:def函数(* args):?或者我还需要做其他事吗? (Python新手,对不起!) – 2010-09-03 18:36:52

+0

@Keith:如果该函数采用任意参数,则将'* args'放入参数列表中,它将接收包含所有参数的元组。如果它是一个固定数量的参数,那么你可以继续直接定义'function(a,b)',例如,获取两个参数。 – Juliano 2010-09-03 20:09:34

你可能想__getattr__,虽然它适用于类属性和方法(因为方法只是属性是是功能)

我寻找相同的,但由于该方法调用是一个两步骤的操作,如: * 1.获得所述属性(OBJ _ GETATTR _) * 2.调用它(measuredObject。_ call _

没有什么神奇的方法可以预测这两种行为。