2010-09-03 9 views
7

In PHP, posso fare qualcosa di simile:Python equivalente al metodo magico __call() di 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" 

Questo sarebbe utile per essere in grado di fare in Python per un progetto su cui sto lavorando (un sacco di brutta XML per analizzare, sarebbe bello trasformarlo in oggetti ed essere in grado di chiamare i metodi.

fa Python ha un equivalente?

risposta

12

Definire un metodo __getattr__ sull'oggetto e restituire una funzione (o una chiusura) da esso.

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

Abbastanza buono, anche se potrebbe essere utile definire la funzione nidificata come 'function (* args)' in modo che il corpo possa utilizzare sia il nome della funzione sia gli argomenti passati. Dipende da ciò che Keith vuole che i metodi facciano. (Ovviamente se non ci saranno mai argomenti per nessuno dei metodi, '__getattr__' stesso potrebbe restituire il risultato, simulando quindi i campi invece dei metodi.) –

+0

In realtà voglio essere in grado di ottenere gli argomenti della funzione come bene. È l'unica modifica necessaria per definire la funzione def(): come funzione def (* args) :? O devo fare anche qualcos'altro? (Python newbie, sorry!) –

+0

@Keith: Se la funzione accetta argomenti arbitrari, quindi metti '* args' nella lista degli argomenti e riceverà una tupla con tutti gli argomenti. Se è un numero fisso di argomenti, allora puoi semplicemente andare avanti e definire 'function (a, b)' direttamente, per esempio, per prendere due argomenti. – Juliano

1

probabilmente si desidera __getattr__, anche se funziona su attributi di classe, nonché i metodi (perché i metodi sono solo attributi che sono funzioni)

0

che stavo cercando la stessa, ma dal momento che il metodo di chiamata è un'operazione in due fasi come: * 1. ottenere l'attributo (. Obj _ getattr _) * 2. definendolo (obtainedObject. _ chiamata _)

non c'è metodo magico che predice entrambe le azioni.

Problemi correlati