2012-06-04 11 views
10

Chcę utworzyć klasę, która nie daje Attribute Error na wywołanie dowolnej metody, które mogą lub nie mogą istnieje:Python: Jak przechwycić wywołanie metody, które nie istnieje?

moja klasa:

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

oczekiwany wynik:

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

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

Teraz unknown_method i unknown_method2 tak naprawdę nie istnieje w klasie, ale w jaki sposób przechwycimy wywołanie metody w pythonie?

+0

możliwe duplikat [metoda Intercept wywołuje w Pythonie] (http://stackoverflow.com/questions/2704434/intercept -method-calls-in-python) – jamylak

+3

Notatka boczna FYI: PEP8 mówi, że powinno być nazywane 'class MagicClass:' a nowy styl powinien przynajmniej dziedziczyć obiekt prawdopodobnie: 'class MagicClass (object):' – mVChr

Odpowiedz

26

Zastąp metodę __getattr__() Magic:

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

drukuje

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

W jaki sposób poradzi sobie z wywołaniem metody: 'ob.calc (1000, 2000)'. Oznacza, w jaki sposób zachowujesz argumenty do połączenia? –

+1

@YugalJindle: Dodano '* args, ** kwargs', aby zaakceptować dowolne parametry w opakowaniu. –

Powiązane problemy