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
答
你可能想__getattr__
,虽然它适用于类属性和方法(因为方法只是属性是是功能)
答
我寻找相同的,但由于该方法调用是一个两步骤的操作,如: * 1.获得所述属性(OBJ _ GETATTR _) * 2.调用它(measuredObject。_ call _)
没有什么神奇的方法可以预测这两种行为。
很不错,尽管定义嵌套函数为'function(* args)'也是有用的,这样主体可以使用函数名和任何传递的参数。取决于Keith想要的方法。 (当然,如果不会有任何方法的参数,'__getattr__'本身可以返回结果,从而模拟字段而不是方法。) – 2010-09-03 18:16:33
我确实希望能够获得函数参数为好。定义def函数()是唯一必要的改变:def函数(* args):?或者我还需要做其他事吗? (Python新手,对不起!) – 2010-09-03 18:36:52
@Keith:如果该函数采用任意参数,则将'* args'放入参数列表中,它将接收包含所有参数的元组。如果它是一个固定数量的参数,那么你可以继续直接定义'function(a,b)',例如,获取两个参数。 – Juliano 2010-09-03 20:09:34