有時候,我們想通過一個類來調(diào)用另一個類里的方法來處理請求,即這兩個類對象參與處理同一個請求對象,只不過一個是 委托者 ,一個是 處理者 。
比如我們現(xiàn)在有一個名為Dog的類對象,我們希望通過它調(diào)用 voice 類產(chǎn)生“狗吠 ” 聲,這時候就可以采用 委托模式 。下面就用Python來理解這個設(shè)計模式。
Python里,在委托者類對象中,需要這么設(shè)計:
1. 重寫__getattr__方法,使得委托者獲得處理者的屬性。
2. 判斷該屬性是否為可調(diào)用函數(shù),如果不是則直接返回,如果是,則用 wrapper 封裝為可調(diào)用對象。
如下所示:
這樣做的好處是,處理者(被委托者)不需要做太多的更改,一般是一個公用類。我們的處理者如下:
這樣就可以通過委托者來調(diào)用另一個類的方法來對請求進行處理:
if __name__ == '__main__':
John = Dog(voice())
John.words('汪汪')
實際上,如果你不重寫__getattr__,一樣可以用以下的方式調(diào)用到voice類:
if __name__ == '__main__':
John = Dog(voice())
John.voice.words('汪汪')
這兩種有什么區(qū)別?使用委托模式,可以簡化代碼,優(yōu)化可讀性,你不需要再調(diào)用voice對象, 委托者自己會利用 getattr 找到相應的對象里的方法。
不過,在Python里,委托模式這樣的寫法其實是 un-pythonic 的,因為它將調(diào)用的方法隱藏在了執(zhí)行者中, 可讀性比較差。如果不是特殊需要,我們一般不會這么做,這里只是給大家展示如何用Python來理解這個設(shè)計模式。
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4346瀏覽量
63006 -
代碼
+關(guān)注
關(guān)注
30文章
4834瀏覽量
69114 -
python
+關(guān)注
關(guān)注
56文章
4809瀏覽量
85069 -
Voice
+關(guān)注
關(guān)注
0文章
9瀏覽量
7250
發(fā)布評論請先 登錄
相關(guān)推薦
關(guān)于委托的理解??!
如何用rpi.gpio的模塊控制gpio接口產(chǎn)生pwm波來控制舵機?
如何用python中的serial向串口發(fā)送和接收數(shù)據(jù)?
如何用python爬取抖音app數(shù)據(jù)
如何用Python來操作Excel文件
如何用Python計算提高機器學習算法和結(jié)果
python有什么用 如何用python創(chuàng)建數(shù)據(jù)庫
如何用Python自動套用模板批量生成PDF文檔
![如<b class='flag-5'>何用</b><b class='flag-5'>Python</b>自動套用模板批量生成PDF文檔](https://file1.elecfans.com/web2/M00/AA/46/wKgZomUt90mAPInNAAF43E3gN6c095.jpg)
如何用Python來實現(xiàn)文件系統(tǒng)的操作功能
![如<b class='flag-5'>何用</b><b class='flag-5'>Python</b><b class='flag-5'>來</b>實現(xiàn)文件系統(tǒng)的操作功能](https://file1.elecfans.com/web2/M00/AB/4C/wKgaomU_TFyAdouzAAAGLFfce2g281.jpg)
如何用Python自動套用模板批量生成PDF文檔
![如<b class='flag-5'>何用</b><b class='flag-5'>Python</b>自動套用模板批量生成PDF文檔](https://file1.elecfans.com/web2/M00/AA/46/wKgZomUt90mAPInNAAF43E3gN6c095.jpg)
如何用python實現(xiàn)RFM建模
![如<b class='flag-5'>何用</b><b class='flag-5'>python</b>實現(xiàn)RFM建模](https://file1.elecfans.com/web2/M00/AD/CC/wKgZomVDCvKAcEvOAAC3MMTWRwA588.jpg)
評論