2009-11-30 24 views
7

En Smalltalk hay un mensaje DoesNotUnderstand que se invoca cuando un objeto no comprende un mensaje (esto es, cuando el objeto no tiene el mensaje enviado implementado).Python - ¿Existe una función que se invoca cuando un objeto no implementa una función?

Entonces, me gustaría saber si en python hay una función que hace lo mismo.

En este ejemplo:

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

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

Por lo tanto, se puede añadir un método para MyObject para que pueda saber cuándo DoSomething esta destinada a ser llamado?

PD: Perdón por mi pobre inglés.

Respuesta

7

Aquí es una propuesta para lo que quieres hacer:

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

Esto es definitivamente lo que quiero! Gracias :) –

+0

¡Me gusta cuando alguien es definitivamente desafiante! (¿O es eso "definitivamente definitivo"?) Lo que sea, ¡SO salva el día otra vez! :) – PaulMcG

3

Está buscando el método __getattr__. Eche un vistazo here.

Si desea el "control total" de una clase, consulte el método especial __getattribute__ (here).

2

No sé qué luc tenido las dos clases separadas. Puedes hacerlo todo con una clase, si utilizas un cierre. De este 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() 

añadí lo de __ignored_attributes__ porque Python estaba mirando hacia arriba __str__ en la clase y que tiene un poco desordenado.

+1

dos clases porque se puede reutilizar más fácilmente. Imagina que quieres el mismo comportamiento para la clase B – luc

Cuestiones relacionadas