2009-11-30 15 views
7

In Smalltalk c'è un messaggio DoesNotUnderstand che viene chiamato quando un oggetto non comprende un messaggio (questo è, quando l'oggetto non ha il messaggio inviato implementato).Python - Esiste una funzione che viene chiamata quando un oggetto non implementa una funzione?

Quindi, mi piacerebbe sapere se in python esiste una funzione che fa la stessa cosa.

In questo esempio:

class MyObject: 
    def __init__(self): 
     print "MyObject created" 

anObject = MyObject() # prints: MyObject created 
anObject.DoSomething() # raise an Exception 

Allora, posso aggiungere un metodo per MyObject così posso sapere quando DoSomething intented essere chiamato?

PS: Ci scusiamo per il mio inglese scarso.

risposta

7

Ecco una proposta per quello che si vuole fare:

class callee: 
    def __init__(self, name): 
     self.name = name 

    def __call__(self): 
     print self.name, "has been called" 


class A: 
    def __getattr__(self, attr): 
     return callee(attr) 

a = A() 

a.DoSomething() 
>>> DoSomething has been called 
+0

Questo è sicuramente quello che voglio! Grazie :) –

+0

Mi piace quando qualcuno è decisamente provocatorio! (o è "decisamente provocatorio"?) Qualunque cosa, SO salva di nuovo la giornata! :) – PaulMcG

3

Si sta cercando il metodo __getattr__. Dai un'occhiata allo here.

Se si desidera il "controllo totale" di una classe, controllare il metodo speciale __getattribute__ (here).

2

non so il motivo per cui luc avuto le due classi separate. Puoi fare tutto con una lezione, se usi una chiusura. In questo modo:

class A(object): 
    __ignored_attributes__ = set(["__str__"]) 

    def __getattr__(self, name): 
     if __name__ in self.__ignored_attributes__: 
      return None 

     def fn(): 
      print name, "has been called with self =", self 

     return fn 

a = A() 
a.DoSomething() 

ho aggiunto la punta circa __ignored_attributes__ perché Python stava guardando __str__ in classe e che ha ottenuto un po 'disordinato.

+1

due classi perché può essere riutilizzato più facilmente. Immagina di volere lo stesso comportamento per la classe B – luc

Problemi correlati