Python相当于PHP的__call()魔术方法?

时间:2010-09-03 17:46:00

标签: php python magic-methods

在PHP中,我可以这样做:

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是否具有等价物?

3 个答案:

答案 0 :(得分:14)

在对象上定义__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

答案 1 :(得分:1)

你可能想要__getattr__,虽然它适用于类属性和方法(因为方法只是作为函数的属性)。

答案 2 :(得分:0)

我一直在寻找相同但是因为方法调用是一个两步操作,如:  * 1.获取属性(obj。 _ getattr _ )  * 2.调用它(gotObject。 _ 调用 _

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