2010-09-03 95 views
7

在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中有相當的?

回答

12

在你的對象上定義一個__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

1

你可能想__getattr__,雖然它適用於類屬性和方法(因爲方法只是屬性是是功能)

0

我尋找相同的,但由於該方法調用是一個兩步驟的操作,如: * 1.獲得所述屬性(OBJ _ GETATTR _) * 2.調用它(measuredObject。_ call _

沒有什麼神奇的方法可以預測這兩種行爲。