利用 Python 理解设计模式之委托模式

有时候,咱们想经过一个类来调用另外一个类里的方法来处理请求,即这两个类对象参与处理同一个请求对象,只不过一个是委托者,一个是处理者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 理解设计模式之委托模式

Python实用宝典

相关文章
相关标签/搜索