有时候,咱们想经过一个类来调用另外一个类里的方法来处理请求,即这两个类对象参与处理同一个请求对象,只不过一个是委托者,一个是处理者。python
好比咱们如今有一个名为Dog的类对象,咱们但愿经过它调用 voice 类产生“狗吠 ” 声,这时候就能够采用委托模式。下面就用Python来理解这个设计模式。设计模式
Python里,在委托者类对象中,须要这么设计:app
1. 重写__getattr__方法,使得委托者得到处理者的属性。函数
2. 判断该属性是否为可调用函数,若是不是则直接返回,若是是,则用 wrapper 封装为可调用对象。优化
以下所示:spa
class Dog: def __init__(self, voice): self.voice = voice def __getattr__(self, name): """ 重写__getattr__方法 得到相应的属性 Arguments: name {str} -- 目标变量/函数名 Returns: attr -- 处理者的变量/函数 """ attr = getattr(self.voice, name) if not callable(attr): return attr def wrapper(*args, **kwargs): return attr(*args, **kwargs) return wrapper
这样作的好处是,处理者(被委托者)不须要作太多的更改,通常是一个公用类。咱们的处理者以下:设计
class voice: def __init__(self): self.p1 = 'test' def words(self, something): print("voice: %s" % something) return "voice: %s" % something
这样就能够经过委托者来调用另外一个类的方法来对请求进行处理:code
if __name__ == '__main__': John = Dog(voice()) John.words('汪汪')
实际上,若是你不重写__getattr__,同样能够用如下的方式调用到voice类:对象
if __name__ == '__main__': John = Dog(voice()) John.voice.words('汪汪')
这两种有什么区别呢?使用委托模式,能够简化代码,优化可读性,你不须要再调用voice对象, 委托者本身会利用 getattr 找到相应的对象里的方法。教程
不过,在Python里,委托模式这样的写法实际上是 un-pythonic 的,由于它将调用的方法隐藏在了执行者中, 可读性比较差。若是不是特殊须要,通常不会这么作,这里只是给你们展现如何用Python来理解这个设计模式。
咱们的文章到此就结束啦,若是你但愿咱们今天的Python 实战教程,请持续关注咱们,若是对你有帮助,麻烦在下面点一个赞/在看哦,有任何问题均可以在下方留言区留言,咱们都会耐心解答的!
Python实用宝典
不仅是一个宝典
欢迎关注公众号:Python实用宝典
原文来自Python实用宝典:利用 Python 理解设计模式之委托模式