2012-06-04 2 views
10

Ich möchte eine Klasse erstellen, die keine Attribute Error auf Abruf jeglicher Methode nicht gibt, das kann oder nicht vorhanden ist:Python: Wie man einen Methodenaufruf abfängt, der nicht existiert?

Meine Klasse:

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

Erwartete Ausgabe:

Jetzt, unknown_method und unknown_method2 existiert nicht wirklich in der Klasse, aber wie kann Wir fangen den Methodenaufruf in Python ab?

+0

möglich Duplikat [Intercept-Methode ruft in Python] (http://stackoverflow.com/questions/2704434/intercept -method-calls-in-python – jamylak

+3

Seitliche Anmerkung FYI: PEP8 sagt, es sollte wie 'class MagicClass:' benannt werden und neuer Stil sollte das Objekt wahrscheinlich zumindest erben: 'class MagicClass (object):' – mVChr

Antwort

26

Überschreiben Sie den __getattr__() magische Methode:

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

druckt

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

Wie wird dies mit einem Methodenaufruf umgehen wie: 'ob.calc (1000, 2000)'. Bedeutet, wie bewahren Sie die Argumente für den Anruf auf? –

+1

@YugalJindle: Es wurden '* args, ** kwargs' hinzugefügt, um beliebige Parameter im Wrapper zu akzeptieren. –

Verwandte Themen