2012-06-04 21 views
10

Quiero crear una clase que no se da una Attribute Error de guardia de cualquier método que puede o no existe:Python: ¿Cómo se intercepta una llamada a método que no existe?

Mi clase:

class magic_class: 
    ... 
    # How to over-ride method calls 
    ... 

Resultados esperados:

ob = magic_class() 
ob.unknown_method() 
# Prints 'unknown_method' was called 

ob.unknown_method2() 
# Prints 'unknown_method2' was called 

Ahora, unknown_method y unknown_method2 no existe realmente en la clase, pero ¿cómo puede interceptamos la llamada al método en python?

+0

posible duplicado del [procedimiento interceptar llamadas en Python] (http://stackoverflow.com/questions/2704434/intercept -method-calls-in-python) – jamylak

+3

Nota al pie FYI: PEP8 dice que debería nombrarse como 'clase MagicClass:' y el nuevo estilo debería al menos heredar objeto probablemente: 'clase MagicClass (objeto):' – mVChr

Respuesta

26

sobrescribir el método __getattr__() mágica:

class MagicClass(object): 
    def __getattr__(self, name): 
     def wrapper(*args, **kwargs): 
      print "'%s' was called" % name 
     return wrapper 

ob = MagicClass() 
ob.unknown_method() 
ob.unknown_method2() 

impresiones

'unknown_method' was called 
'unknown_method2' was called 
+0

¿Cómo se manejará esto con un método como: 'ob.calc (1000, 2000)'. Significa ¿cómo se conservan los argumentos a la llamada? –

+1

@YugalJindle: se agregó '* args, ** kwargs' para aceptar parámetros arbitrarios en el contenedor. –

Cuestiones relacionadas