代表在python中

Mat*_*tyW 16 python delegates design-patterns

我已经实现了这个简短的例子,试图演示一个简单的委托模式.我的问题是.这看起来像是我理解代表团吗?

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')
Run Code Online (Sandbox Code Playgroud)

Ned*_*der 14

一个Python提示:你不需要说:

func = getattr(self.handler, 'Handle')
func(event)
Run Code Online (Sandbox Code Playgroud)

说啊:

self.handler.Handle(event)
Run Code Online (Sandbox Code Playgroud)

我不确定你在使用Handler类时做了什么,在你的例子中没有使用它.

在Python中,具有大写名称的方法非常不寻常,通常是使用这样的名称移植一些现有API的结果.

  • 感谢Ned,这是使用Command Dispatch模式的更大示例的一部分,这就是为什么我使用getattr的原因,感谢您注意到错误的方法名称,我将修复该问题 (2认同)

Amb*_*ber 7

这是基本概念,是的 - 将一些传入请求传递给另一个对象来处理.