有時(shí)候,我們想通過(guò)一個(gè)類(lèi)來(lái)調(diào)用另一個(gè)類(lèi)里的方法來(lái)處理請(qǐng)求,即這兩個(gè)類(lèi)對(duì)象參與處理同一個(gè)請(qǐng)求對(duì)象,只不過(guò)一個(gè)是 委托者 ,一個(gè)是 處理者 。
比如我們現(xiàn)在有一個(gè)名為Dog的類(lèi)對(duì)象,我們希望通過(guò)它調(diào)用 voice 類(lèi)產(chǎn)生“狗吠 ” 聲,這時(shí)候就可以采用 委托模式 。下面就用Python來(lái)理解這個(gè)設(shè)計(jì)模式。
Python里,在委托者類(lèi)對(duì)象中,需要這么設(shè)計(jì):
1. 重寫(xiě)__getattr__方法,使得委托者獲得處理者的屬性。
2. 判斷該屬性是否為可調(diào)用函數(shù),如果不是則直接返回,如果是,則用 wrapper 封裝為可調(diào)用對(duì)象。
如下所示:
這樣做的好處是,處理者(被委托者)不需要做太多的更改,一般是一個(gè)公用類(lèi)。我們的處理者如下:
這樣就可以通過(guò)委托者來(lái)調(diào)用另一個(gè)類(lèi)的方法來(lái)對(duì)請(qǐng)求進(jìn)行處理:
if __name__ == '__main__':
John = Dog(voice())
John.words('汪汪')
實(shí)際上,如果你不重寫(xiě)__getattr__,一樣可以用以下的方式調(diào)用到voice類(lèi):
if __name__ == '__main__':
John = Dog(voice())
John.voice.words('汪汪')
這兩種有什么區(qū)別?使用委托模式,可以簡(jiǎn)化代碼,優(yōu)化可讀性,你不需要再調(diào)用voice對(duì)象, 委托者自己會(huì)利用 getattr 找到相應(yīng)的對(duì)象里的方法。
不過(guò),在Python里,委托模式這樣的寫(xiě)法其實(shí)是 un-pythonic 的,因?yàn)樗鼘⒄{(diào)用的方法隱藏在了執(zhí)行者中, 可讀性比較差。如果不是特殊需要,我們一般不會(huì)這么做,這里只是給大家展示如何用Python來(lái)理解這個(gè)設(shè)計(jì)模式。
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4365瀏覽量
63905 -
代碼
+關(guān)注
關(guān)注
30文章
4882瀏覽量
70046 -
python
+關(guān)注
關(guān)注
56文章
4822瀏覽量
85894 -
Voice
+關(guān)注
關(guān)注
0文章
9瀏覽量
7325
發(fā)布評(píng)論請(qǐng)先 登錄
關(guān)于委托的理解??!
如何用rpi.gpio的模塊控制gpio接口產(chǎn)生pwm波來(lái)控制舵機(jī)?
請(qǐng)問(wèn)如何用Python來(lái)寫(xiě)單片機(jī)?
如何用python中的serial向串口發(fā)送和接收數(shù)據(jù)?
如何用python爬取抖音app數(shù)據(jù)
如何用Python來(lái)操作Excel文件
如何用Python計(jì)算提高機(jī)器學(xué)習(xí)算法和結(jié)果
python有什么用 如何用python創(chuàng)建數(shù)據(jù)庫(kù)
如何用Python自動(dòng)套用模板批量生成PDF文檔

如何用Python來(lái)實(shí)現(xiàn)文件系統(tǒng)的操作功能

如何用Python自動(dòng)套用模板批量生成PDF文檔

如何用python實(shí)現(xiàn)RFM建模

評(píng)論