2010-09-03 22 views
7

En PHP, que puede hacer algo como esto:equivalente en Python del método mágico de PHPs __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" 

Esto sería útil para poder hacerlo en Python para un proyecto que estoy trabajando (un montón de XML para analizar desagradable, que sería agradable para convertirlo en objetos y ser capaz de simplemente llamar a métodos.

¿el Python tiene un equivalente?

Respuesta

12

Defina un método __getattr__ en su objeto y devuelva una función (o un cierre) de él.

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

Bastante bien, aunque también podría ser útil definir la función anidada como 'función (* args)' para que el cuerpo pueda usar tanto el nombre de la función como los argumentos pasados. Depende de lo que Keith quiera que hagan los métodos. (Por supuesto, si nunca existieran argumentos para alguno de los métodos, '__getattr__' mismo podría devolver el resultado, simulando así campos en lugar de métodos). –

+0

De hecho, quiero poder obtener los argumentos de la función como bien. Es el único cambio necesario para definir la función def(): como función def (* args) :? ¿O necesito hacer algo más también? (Novato Python, lo siento!) –

+0

@Keith: si la función toma argumentos arbitrarios, entonces ponga '* args' en la lista de argumentos y recibirá una tupla con todos los argumentos. Si se trata de un número fijo de argumentos, puede seguir adelante y definir 'function (a, b)' directamente, por ejemplo, para tomar dos argumentos. – Juliano

1

es posible que desee __getattr__, aunque funciona en atributos de clase, así como los métodos (porque los métodos son sólo atributos que son funciones).

0

que estaba buscando lo mismo pero desde el llamado método es una operación de dos etapas como: * 1. obtener el atributo (. Obj _ getattr _) * 2. llamándola (obtainedObject. _ llamada _)

no hay método mágico que predice ambas acciones.

Cuestiones relacionadas