2012-06-04 20 views
10

Voglio creare una classe che non dà un Attribute Error su chiamata di qualsiasi metodo che può o non può esiste:Python: come intercettare una chiamata al metodo che non esiste?

La mia classe:

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

Output previsto:

Ora, unknown_method e unknown_method2 in realtà non esiste nella classe, ma come può intercettiamo la chiamata al metodo in python?

+0

possibile duplicato del [metodo di intercettare le chiamate in Python] (http://stackoverflow.com/questions/2704434/intercept -method-calls-in-python) – jamylak

+3

Nota a margine FYI: PEP8 dice che dovrebbe essere chiamato come 'class MagicClass:' e il nuovo stile dovrebbe almeno ereditare l'oggetto probabilmente: 'class MagicClass (oggetto):' – mVChr

risposta

26

sovrascrivere il metodo di __getattr__() magia:

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() 

stampe

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

Come si tratterà di una chiamata di metodo come: 'ob.calc (1000, 2000)'. Significa come si conservano gli args alla chiamata? –

+1

@YugalJindle: aggiunto '* args, ** kwargs' per accettare parametri arbitrari nel wrapper. –

Problemi correlati