Delegates in python

32,242

Solution 1

That's the basic concept, yes - passing on some incoming request to another object to take care of.

Solution 2

One Python tip: you don't need to say:

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

just say:

self.handler.Handle(event)

I'm not sure what you are doing with your Handler class, it isn't used in your example.

And in Python, methods with upper-case names are very very unusual, usually a result of porting some existing API with names like that.

Share:
32,242
MattyW
Author by

MattyW

I love writing software for automation. From the low level firmware that controls the motor's through to the high level sequencing and state-spaced searching. Recently I've got into android and iPhone programming.

Updated on July 09, 2022

Comments

  • MattyW
    MattyW almost 2 years

    I've implemented this short example to try to demonstrate a simple delegation pattern. My question is. Does this look like I've understood delegation right?

    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')
    
  • MattyW
    MattyW almost 14 years
    Thanks Ned, it's part of greater example using the Command Dispatch pattern which is why I'm using getattr, thanks for noticing the bad method name, I'll fix that