2010-09-04 3 views
13

J'ai implémenté ce court exemple pour essayer de démontrer un modèle de délégation simple. Ma question est. Cela ressemble-t-il à une délégation que j'ai comprise?Délégués 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

Que faites-vous avec la classe 'Handler'? – Santa

+0

Cela fait partie d'un exemple plus grand, et j'ai oublié de m'en débarrasser quand je l'ai posté ici. – MattyW

+2

Dans le code ci-dessus, vos classes Geo, Steve et Andy ont une fonction Handle dans laquelle vous appelez getattr(). Je recommande de vérifier que la fonction existe réellement dans l'objet délégué avec hasattr() avant d'appeler getattr. Je voulais juste le signaler parce que cela pourrait être une source d'accidents. – Ashbay

Répondre

4

C'est le concept de base, oui - transmettre une demande entrante à un autre objet à prendre en charge.

11

Une astuce Python: vous n'avez pas besoin de dire:

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

disent simplement:

self.handler.Handle(event) 

Je ne sais pas ce que vous faites avec votre classe de gestionnaire, il n » est pas t utilisé dans votre exemple. Et en Python, les méthodes avec des noms en majuscules sont très inhabituelles, généralement en raison du portage d'une API existante avec des noms comme ça.

+1

Merci Ned, ça fait partie d'un exemple plus grand utilisant le pattern Command Dispatch, c'est pourquoi j'utilise getattr, merci d'avoir remarqué le mauvais nom de la méthode, je vais corriger ça – MattyW