有时候,我们想通过一个类调用另一个类中的方法来处理一个请求,即这两个类对象参与处理同一个请求对象,但是其中一个是代表,一个是处理程序。比如我们现在有一个名为Dog的类对象,我们希望调用voice类来产生“狗叫”的声音。这时候我们可以使用委托模式。让我们使用Python来理解这种设计模式。在Python中,在delegator类对象中,需要这样设计:1.重写__getattr__方法,让delegator可以获取到handler的属性。2、判断属性是否为可调用函数,如果不是,直接返回,如果是,则使用wrapper封装为可调用对象。如下:classDog:def__init__(self,voice):self.voice=voicedef__getattr__(self,name):"""重写__getattr__方法获取对应的属性参数:name{str}--targetVariable/函数名返回:attr--处理程序的变量/函数"""attr=getattr(self.voice,name)ifnotcallable(attr):returnattrdefwrapper(*args,**kwargs):returnattr(*args,**kwargs)returnwrapper这样做的好处是处理者(委托者)不需要做太多改动,一般都是public类。我们的处理程序看起来像这样:这样,委托者就可以调用另一个类的方法来处理请求了:if__name__=='__main__':John=Dog(voice())John.words('Wow')其实如果不't写__getattr__,也可以通过下面的方式调用voice类:if__name__=='__main__':John=Dog(voice())John.voice.words('Wow')这两个有什么区别?使用委托模式可以简化代码并优化可读性。你不需要再调用语音对象了,delegate会使用getattr在对应的对象中寻找方法。但是在Python中,delegation模式的写法其实是un-pythonic的,因为它把调用的方法隐藏在了executor中,可读性比较差。如果不是特殊需要,一般不要这样做,这里只是向大家展示如何使用Python来理解这种设计模式。这是我们文章的结尾。想要我们今天的Python实战教程,请继续关注我们。如果对您有帮助,请在下方点赞/观看。有什么问题可以在下方评论留言,我们会耐心解答!Python实战宝典不只是集合欢迎关注公众号:Python实战宝典原文来自Python实战宝典:用Python看懂委托模式的设计模式
