2010-09-04 30 views
13

Implementé este pequeño ejemplo para tratar de demostrar un patrón de delegación simple. Mi pregunta es. ¿Parece que entendí la delegación, verdad?Delegados en python

class Handler: 
    def __init__(self, parent = None): 
     self.parent = parent 
    def Handle(self, event): 
     handler = 'Handle_' +event 
     if hasattr(self, handler): 
      func = getattr(self, handler) 
      func() 
     elif self.parent: 
      self.parent.Handle(event) 

class Geo(): 
    def __init__(self, h): 
     self.handler = h 

    def Handle(self, event): 
     func = getattr(self.handler, 'Handle') 
     func(event) 

class Steve(): 
    def __init__(self, h): 
     self.handler = h 

    def Handle(self, event): 
     func = getattr(self.handler, 'Handle') 
     func(event) 

class Andy(): 
    def Handle(self, event): 
     print 'Andy is handling %s' %(event) 

if __name__ == '__main__':   
    a = Andy() 
    s = Steve(a) 
    g = Geo(s) 
    g.Handle('lab on fire') 
+3

¿Qué estás haciendo con la clase 'Handler'? – Santa

+0

Esto es parte de un ejemplo más grande, y olvidé deshacerme de él cuando lo publiqué aquí. – MattyW

+2

En el código anterior, las clases Geo, Steve y Andy tienen una función de manejo en la que se llama getattr(). Recomiendo verificar que la función realmente existe en el objeto delegado con hasattr() antes de llamar a getattr. Solo quería señalar eso porque podría ser una fuente de bloqueos. – Ashbay

Respuesta

4

Ese es el concepto básico, sí, al enviar una solicitud entrante a otro objeto para que se ocupe de ello.

11

Un consejo Python: no es necesario decir:

func = getattr(self.handler, 'Handle') 
func(event) 

a decir:

self.handler.Handle(event) 

No estoy seguro de lo que está haciendo con su clase Handler, que ISN' t usado en tu ejemplo.

Y en Python, los métodos con nombres en mayúsculas son muy poco comunes, generalmente como resultado de portar algunas API existentes con nombres como ese.

+1

Gracias Ned, es parte de un ejemplo más grande usando el patrón Command Dispatch, por eso estoy usando getattr, gracias por notar el mal nombre del método, voy a arreglar eso – MattyW