Python 設(shè)計(jì)模式——命令模式
命令模式是一種行為設(shè)計(jì)模式??梢杂脕?lái)實(shí)現(xiàn)比如安裝軟件時(shí)的安裝向?qū)Чδ埽ǔ0惭b向?qū)?huì)通過(guò)多個(gè)步驟根據(jù)用戶的選擇了解用戶的偏好。安裝向?qū)紫葐?dòng)一個(gè)名為 Command 的對(duì)象,用于存儲(chǔ)在向?qū)У亩鄠€(gè)步驟中用戶指定的選項(xiàng)。當(dāng)用戶在*一個(gè)步驟中點(diǎn)擊完成按鈕時(shí),Command 對(duì)象就會(huì)運(yùn)行 execute() 方法,該方法會(huì)考察所有存儲(chǔ)的選項(xiàng)并完成相應(yīng)的安裝過(guò)程。
命令模式通常包含以下術(shù)語(yǔ):
命令模式的主要意圖:
命令模式的適用場(chǎng)景:
命令模式的優(yōu)點(diǎn):
命令模式的缺點(diǎn):
你們都是怎么學(xué) Python 的?
學(xué)習(xí)Python大致可以分為以下幾個(gè)階段:
1.剛上手的時(shí)候肯定是先過(guò)一遍Python最基本的知識(shí),比如說(shuō):變量、數(shù)據(jù)結(jié)構(gòu)、語(yǔ)法等,基礎(chǔ)過(guò)的很快,基本上1~2周時(shí)間就能過(guò)完了,我當(dāng)時(shí)是在這兒看的基礎(chǔ):Python 簡(jiǎn)介 | 菜鳥教程果你想簡(jiǎn)單點(diǎn),我把我自己的學(xué)習(xí)經(jīng)驗(yàn)總結(jié)成了一本Python以及爬蟲電子書,保證非常的通俗易懂幫助你學(xué)會(huì)Python,目前這本書幫助了數(shù)十萬(wàn)的人從零開始學(xué)會(huì)了Python。
2.看完基礎(chǔ)后,就是做一些小項(xiàng)目鞏固基礎(chǔ),比方說(shuō):做一個(gè)終端計(jì)算器,如果實(shí)在找不到什么練手項(xiàng)目,可以在 - learn to code, , for free 上面進(jìn)行練習(xí)。
3.如果時(shí)間充裕的話可以買一本講Python基礎(chǔ)的書籍比如《Python編程》,閱讀這些書籍,在鞏固一遍基礎(chǔ)的同時(shí)你會(huì)發(fā)現(xiàn)自己諸多沒(méi)有學(xué)習(xí)到的邊邊角角,這一步是對(duì)自己基礎(chǔ)知識(shí)的補(bǔ)充。
4.Python庫(kù)是Python的精華所在,可以說(shuō)Python庫(kù)組成并且造就了Python,Python庫(kù)是Python開發(fā)者的利器,所以學(xué)習(xí)Python庫(kù)就顯得尤為重要:The Python Standard Library ,Python庫(kù)很多,如果你沒(méi)有時(shí)間全部看完,不妨學(xué)習(xí)一遍常用的Python庫(kù):Python常用庫(kù)整理 - 知乎專欄
5.Python庫(kù)是開發(fā)者利器,用這些庫(kù)你可以做很多很多東西,最常見的網(wǎng)絡(luò)爬蟲、自然語(yǔ)言處理、圖像識(shí)別等等,這些領(lǐng)域都有很強(qiáng)大的Python庫(kù)做支持,所以當(dāng)你學(xué)了Python庫(kù)之后,一定要*時(shí)間進(jìn)行練習(xí)。如何尋找自己需要的Python庫(kù)呢?推薦我之前的一個(gè)回答:如何找到適合需求的 Python 庫(kù)?
6.學(xué)習(xí)使用了這些Python庫(kù),此時(shí)的你應(yīng)該是對(duì)Python十分滿意,也十分激動(dòng)能遇到這樣的語(yǔ)言,就是這個(gè)時(shí)候不妨開始學(xué)習(xí)Python數(shù)據(jù)結(jié)構(gòu)與算法,Python設(shè)計(jì)模式,這是你進(jìn)一步學(xué)習(xí)的一個(gè)重要步驟:faif/python-patterns
7.當(dāng)度過(guò)艱難的第六步,此時(shí)選擇你要研究的方向,如果你想做后端開發(fā),不妨研究研究Django,再往后,就是你自己自由發(fā)揮了。
Python設(shè)計(jì)模式 - 適配器模式
'''
適配器模式:將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。
應(yīng)用場(chǎng)景:希望復(fù)用一些現(xiàn)存的類,但是接口又與復(fù)用環(huán)境要求不一致。
分類:類適配器(通過(guò)多重繼承)、對(duì)象適配器。
'''
class?Dog(object):
????def?__init__(self):
????????self.name?=?"Dog"
????def?bark(self):
????????return?"汪!"
class?Cat(object):
????def?__init__(self):
????????self.name?=?"Cat"
????def?meow(self):
????????return?"喵!"
class?Human(object):
????def?__init__(self):
????????self.name?=?"Human"
????def?speak(self):
????????return?"'你好'"
class?Car(object):
????def?__init__(self):
????????self.name?=?"Car"
????def?make_noise(self,?octane_level):
????????return?"引擎聲{0}".format("!"?*?octane_level)
class?Adapter(object):
????def?__init__(self,?obj,?**adapted_methods):
????????"""我們對(duì)象字典里設(shè)置適配的方法"""
????????self.obj?=?obj
????????'''update()方法添加鍵?-?值對(duì)到字典'''
????????self.__dict__.update(adapted_methods)
????"""我們可以通過(guò)重載__getattr__和__setattr__來(lái)攔截對(duì)成員的訪問(wèn)或者作出一些自己希望的行為
?????__getattr__?在訪問(wèn)對(duì)象訪問(wèn)類中不存在的成員時(shí)會(huì)自動(dòng)調(diào)用"""
????def?__getattr__(self,?attr):
????????return?getattr(self.obj,?attr?,'沒(méi)有找到此屬性')
????def?original_dict(self):
????????"""輸出對(duì)象的實(shí)例屬性"""
????????return?self.obj.__dict__
def?main():
????"""定義一個(gè)空對(duì)象列表"""
????objects?=?[]
????dog?=?Dog()
????print(dog.__dict__)
????'''追加Adapter實(shí)例對(duì)象到列表'''
????objects.append(Adapter(dog,?make_noise=dog.bark))
????'''Adapter實(shí)例屬性,?實(shí)例也有一個(gè)?__dict__特殊屬性,它是實(shí)例屬性構(gòu)成的一個(gè)字典:'''
????'''__dict__?返回的是一個(gè)字典,它的鍵(key)是屬性名,鍵值(value)是相應(yīng)的屬性對(duì)象的數(shù)據(jù)值'''
????'''實(shí)例僅擁有數(shù)據(jù)屬性,它是與某個(gè)類的實(shí)例相關(guān)聯(lián)的數(shù)據(jù)值,這些值獨(dú)立于其他實(shí)例或類。當(dāng)一個(gè)實(shí)例被釋放后,它的屬性同時(shí)也被清除了。'''
????print(objects[0].__dict__)
????print(objects[0].original_dict())
????print(objects[0].QQ)
????print(objects[0].make_noise())
????print("-----------------------------------------------")
????cat?=?Cat()
????objects.append(Adapter(cat,?make_noise=cat.meow))
????print(objects[1].__dict__)
????print("-----------------------------------------------")
????human?=?Human()
????objects.append(Adapter(human,?make_noise=human.speak))
????print(objects[2].__dict__)
????print("-----------------------------------------------")
????car?=?Car()
????objects.append(Adapter(car,?make_noise=lambda:?car.make_noise(5)))
????print(objects[3].__dict__)
????print("-----------------------------------------------")
????for?obj?in?objects:
????????print("一個(gè)?{0}?正在?{1}".format(obj.name,?obj.make_noise()))
if?__name__?==?"__main__":
????????main()
python常用的幾種設(shè)計(jì)模式是什么
python常用的幾種設(shè)計(jì)模式有:1、單例模式,確保某一個(gè)類只有一個(gè)實(shí)例;2、工廠模式,使用一個(gè)公共的接口來(lái)創(chuàng)建對(duì)象;3、策略模式,隨著策略對(duì)象改變內(nèi)容;4、門面模式,對(duì)子系統(tǒng)的封裝,使得封裝接口不會(huì)被單獨(dú)提出來(lái)。
什么是設(shè)計(jì)模式?
設(shè)計(jì)模式是一套被反復(fù)使用,多數(shù)人知道,經(jīng)過(guò)分類編目的代碼設(shè)計(jì)經(jīng)驗(yàn)總結(jié)。
使用設(shè)計(jì)模式是為了提高代碼可重用性,可閱讀性,和可靠性。
你說(shuō)理解的設(shè)計(jì)模式有幾種?
設(shè)計(jì)模式又可分為三種:創(chuàng)建型(單例模式)、(工廠模式),結(jié)構(gòu)型,行為型(策略模式)
單例模式以及應(yīng)用場(chǎng)景:
(1)確保某一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例,這個(gè)類稱為單例類,單例模式是一種對(duì)象創(chuàng)建型模式。Windows的Task Manager(任務(wù)管理器)、Recycle Bin(回收站)、網(wǎng)站計(jì)數(shù)器
(2)單例模式應(yīng)用的場(chǎng)景一般發(fā)現(xiàn)在以下條件下:
資源共享的情況下,避免由于資源操作時(shí)導(dǎo)致的性能或損耗等。如上述中的日志文件,應(yīng)用配置。控制資源的情況下,方便資源之間的互相通信。如線程池等
要點(diǎn):一是某個(gè)類只能有一個(gè)實(shí)例;二是它必須自行創(chuàng)建這個(gè)實(shí)例;三是它必須自行向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。
工廠模式:
提供一個(gè)創(chuàng)建對(duì)象的接口,不像客戶端暴露創(chuàng)建對(duì)象的過(guò)程,而是使用一個(gè)公共的接口來(lái)創(chuàng)建對(duì)象。
可以分為三種:簡(jiǎn)單工廠? 工廠方法? ?抽象工廠
一個(gè)類的行為或其算法可以在運(yùn)行時(shí)更改。這種類型的設(shè)計(jì)模式屬于行為型模式。
策略模式:
在策略模式中,我們創(chuàng)建表示各種策略的對(duì)象和一個(gè)行為隨著策略對(duì)象改變而改變的 context 對(duì)象。策略對(duì)象改變 context 對(duì)象的執(zhí)行算法。
要點(diǎn):把一個(gè)個(gè)策略,也就是算法封裝成一個(gè)一個(gè)類,任意的替換
解決的問(wèn)題:避免多個(gè)if....else帶來(lái)的復(fù)雜
使用場(chǎng)景:系統(tǒng)中需要?jiǎng)討B(tài)的在集中算法中動(dòng)態(tài)的選擇一種,
門面模式:
門面模式也叫外觀模式,定義如下:要求一個(gè)子系統(tǒng)的外部與其內(nèi)部的通信必須通過(guò)一個(gè)統(tǒng)一的對(duì)象進(jìn)行。門面模式提供一個(gè)高層次的接口,使得子系統(tǒng)更易于使用。門面模式注重“統(tǒng)一的對(duì)象”,也就是提供一個(gè)訪問(wèn)子系統(tǒng)的接口。門面模式與之前說(shuō)過(guò)的模板模式有類似的地方,都是對(duì)一些需要重復(fù)方法的封裝。但從本質(zhì)上來(lái)說(shuō),是不同的。模板模式是對(duì)類本身的方法的封裝,其被封裝的方法也可以單獨(dú)使用;而門面模式,是對(duì)子系統(tǒng)的封裝,其被封裝的接口理論上是不會(huì)被單獨(dú)提出來(lái)用的。
一個(gè)對(duì)象有很多行為,如果么有選擇合適的設(shè)計(jì)模式,這些行為就需要用多重的條件判斷來(lái)實(shí)現(xiàn)算法的切換,增加了代碼的復(fù)雜度。
推薦課程:Python面對(duì)對(duì)象(Corey Schafer)
Python設(shè)計(jì)模式 - 代理模式
"""
代理模式(Proxy):為某個(gè)對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。
注意:代理模式和策略模式的類圖很相近,實(shí)現(xiàn)方法也是一樣的,但是應(yīng)用場(chǎng)景很不一樣,體現(xiàn)了不同的思想。
????策略模式中同一外部對(duì)象訪問(wèn)上下文對(duì)象的操作一樣,但是里面的策略對(duì)象不同。
????代理模式中不同的外部對(duì)象訪問(wèn)代理對(duì)象的操作一樣,但是里面的真實(shí)對(duì)象是一樣的。
代理模式在訪問(wèn)對(duì)象時(shí)引入一定程度的間接性,因?yàn)檫@種間接性,可以附加多種用途。
應(yīng)用場(chǎng)景:
1、遠(yuǎn)程代理。為一個(gè)對(duì)象在不同的地址空間提供局部代表。這樣可以隱藏一個(gè)對(duì)象存在于不同地址空間的事實(shí)。
2、虛擬代理。當(dāng)要?jiǎng)?chuàng)建耗時(shí)很長(zhǎng)的對(duì)象時(shí),可以使用虛擬代理。虛擬代理完成的工作為新建真實(shí)對(duì)象,并在新建的過(guò)程中給出提示。比如在網(wǎng)頁(yè)加載圖片的過(guò)程中,虛擬代理可以用一個(gè)圖片框暫時(shí)替代真實(shí)的圖片。
3、安全代理。用于控制真實(shí)對(duì)象訪問(wèn)是的權(quán)限。
4、智能指引。當(dāng)調(diào)用真實(shí)的對(duì)象時(shí),代理處理另外一些事情,比如計(jì)算真實(shí)對(duì)象的引用次數(shù)、是否鎖定等等。
"""
import?time
class?:
????def?talk(self):
????????print("銷售經(jīng)理準(zhǔn)備談")
class?Proxy:
????def?__init__(self):
????????self.busy?=?'No'
????????self.sales?=?None
????def?talk(self):
????????print("代理檢查銷售經(jīng)理的可訪問(wèn)性")
????????if?self.busy?==?'No':
????????????self.sales?=?()
????????????time.sleep(0.1)
????????????self.sales.talk()
????????else:
????????????time.sleep(0.1)
????????????print("銷售經(jīng)理正忙")
class?(Proxy):
????def?talk(self):
????????print("代理檢查銷售經(jīng)理的可訪問(wèn)性")
????????time.sleep(0.1)
????????print("該銷售經(jīng)理也不會(huì)跟你說(shuō)話不論他/她是否正忙")
if?__name__?==?'__main__':
????p?=?Proxy()
????p.talk()
????p.busy?=?'Yes'
????p.talk()
????p?=?()
????p.talk()
????p.busy?=?'Yes'
????p.talk()
python基礎(chǔ)教程
你可以看黑馬程序員Python入門教程:
教程學(xué)習(xí)時(shí)間15天
1-3天內(nèi)容:為L(zhǎng)inux基礎(chǔ)命令
4-13天內(nèi)容:為Python基礎(chǔ)教程14-15 天內(nèi)容:為飛機(jī)大戰(zhàn)項(xiàng)目演練
*階段(1-3天):
該階段首先通過(guò)介紹不同領(lǐng)域的三種操作系統(tǒng),操作系統(tǒng)的發(fā)展簡(jiǎn)史以及Linux系統(tǒng)的文件目錄結(jié)構(gòu)讓大家對(duì)Linux系統(tǒng)有一個(gè)簡(jiǎn)單的認(rèn)識(shí),同時(shí)知道為什么要學(xué)習(xí)Linux命令。然后我們會(huì)正式學(xué)習(xí)Linux命令
1. 文件和目錄命令:ls,cd,touch,mkdir,rm
2. 拷貝和移動(dòng)命令:tree,cp,mv
3. 文件內(nèi)容命令:cat,more,grep
4. 遠(yuǎn)程管理命令:ifconfig,ping,SSH的工作方式簡(jiǎn)介以及ssh命令
5. 用戶權(quán)限及用戶管理命令:chmod,chgrp,useradd,passwd,userdel
6. 軟件安裝及壓縮命令:apt簡(jiǎn)介及命令,tar,gzip壓縮命令,bzip2壓縮命令
7. vim的基本使用
第二階段(4-10天)
該階段我們正式進(jìn)入Python這門語(yǔ)言的學(xué)習(xí),首先通過(guò)了解Python語(yǔ)言的起源,Python語(yǔ)言的設(shè)計(jì)目標(biāo),Python語(yǔ)言的設(shè)計(jì)哲學(xué),Python語(yǔ)言的優(yōu)缺點(diǎn)和面向?qū)ο蟮幕靖拍?,以及Python語(yǔ)言的執(zhí)行方式,還有Python集成開發(fā)環(huán)境PyCharm的使用為我們接下來(lái)的學(xué)習(xí)做鋪墊。
然后我們會(huì)學(xué)習(xí)int,string,float三種簡(jiǎn)單的變量類型,變量間的計(jì)算,變量的輸入輸出,if判斷語(yǔ)句,while循環(huán)語(yǔ)句,for循環(huán)語(yǔ)句,break和continue的使用,函數(shù)的基本使用,模塊的使用,列表,元組,字典三種高級(jí)變量,字符串的常用操作。
接下來(lái)我們會(huì)通過(guò)一個(gè)名片管理系統(tǒng)的案例,把這一階段的知識(shí)進(jìn)行一個(gè)串聯(lián)。在學(xué)習(xí)名片管理系統(tǒng)時(shí),首先我們會(huì)學(xué)習(xí)怎么去搭建這一系統(tǒng)的框架,然后我們會(huì)分別實(shí)現(xiàn)新增名片,顯示全部名片,查詢名片,刪除名片,修改名片這些功能。
*我們會(huì)學(xué)習(xí)語(yǔ)法的進(jìn)階內(nèi)容,全局變量,局部變量,可變數(shù)據(jù)類型和不可變數(shù)據(jù)類型以及函數(shù)返回多個(gè)值,函數(shù)的缺省參數(shù),多值參數(shù),遞歸的基本使用。
第三階段(11-13天)
該階段我們會(huì)學(xué)習(xí)面向?qū)ο螅∣OP)這一重要的編程思想,首先學(xué)習(xí)的知識(shí)點(diǎn)有類和對(duì)象的基本概念,dir函數(shù),self的作用,初始化方法__init__,內(nèi)置函數(shù)__str__,__del__,單繼承,方法重寫,私有屬性和方法,多繼承,多態(tài),類屬性,靜態(tài)方法。
然后我們還會(huì)學(xué)習(xí)單例模式這一設(shè)計(jì)模式,異常的捕獲,異常的拋出,from import局部導(dǎo)入,from import導(dǎo)入同名工具, from import導(dǎo)入所有工具,包的使用,制作模塊,pip的使用以及文件的相關(guān)操作。
第四階段(14-15天)
該階段是項(xiàng)目演練階段,我們會(huì)帶領(lǐng)大家通過(guò)使用之前學(xué)習(xí)過(guò)的知識(shí)開發(fā)飛機(jī)大戰(zhàn)這一經(jīng)典游戲,項(xiàng)目中分別有游戲窗口,圖像繪制,游戲循環(huán),事件監(jiān)聽,精靈和精靈組以及創(chuàng)建敵機(jī),創(chuàng)建英雄和發(fā)射子彈,碰撞檢測(cè)等模塊