您現在的位置是:首頁 > 運動
面試必問的“單例模式”究竟是什麼鬼?有哪些優缺點和實現方式
什麼情況下會用到單例模式
很多面試python初級崗位的同學,有大機率會被問到
單例模式
,而且一般都會現場讓你寫一個單例。可是有很多同學可能不是很理解,甚至專門把程式碼背下來,說實話,有點不靠譜。本文將基於python分享
單例模式
的那點事,希望對你有所幫助
放假啦!
01
官方定義
單例是一種設計模式
,應用該模式的類只會生成一個例項。
單例模式保證了在程式的不同位置都可以且僅可以取到同一個物件例項:如果例項不存在,會建立一個例項;如果已存在就會返回這個例項。 因為單例是一個類,所以你也可以為其提供相應的操作方法,以便於對這個例項進行管理
02
個人理解
舉個例子來說:
類
可以看作固定的一塊地,
類的例項化物件
就是這個土地的使用
每個建造師給一塊土地,要求是:只能在分配的土地上造房子,怎麼造不管。也就是說,第一次房子造好了,後面怎麼改,都是在這塊土地上對這個房子進行改造。如果他對房子不滿意,重新造房子還是在這塊土地上建造……也就是說,不管這個建築師怎麼折騰,折騰的都是這片土地。(簡單來講,
單例模式下,
例項一旦生成,永遠都駐紮在記憶體中的同一個地址,所以怎麼改都是改該位置上的物件
)
03
單例模式的作用
全域性變數,我相信大夥都不陌生吧。
全域性變數一般在專案中的作用,是根據某個動作是否完成做出相應的操作。一般開始都有個預設值,如果完成了,將預設值更改,如果沒完成,繼續執行
單例也是為了達到這個目的,允許你在程式的任何地方訪問這個物件,且提供了更為全面的屬性和方法,讓你可以在設計類時,完美地實現這個特殊的“全域性變數”。
單例模式吸收了全域性變數的優點,摒棄了全域性變數的缺點,如果要考慮使用全域性變數控制程式的業務邏輯,可以考慮使用單例模式。
04
單例模式的不足
單例類如果使用繼承,子類例項化可能會出現問題
單例類不是特別好擴充套件,因為一般沒有抽象層
05
單例模式的幾種實現
1.python模組就是天然的單例模式
因為模組在第一次匯入時,會生成
。pyc檔案,當第二次匯入時,就會直接載入 。pyc檔案,而不會再次執行模組程式碼。因此,我們只需把相關的函式和資料定義在一個模組中,就可以獲得一個單例物件了
程式碼如下
模組中的單例
用以下的方法匯入就算做是單例的使用了
匯入即可
2.使用__new__方法
網路上提到的最多的實現的手段,不再多做介紹,直接上程式碼
3.使用元類
元類可以說是python中最難理解的點了,簡單的描述下:
首先
每一個類預設的元類是type類,預設的基類是object類
,這兩個是有區別的
預設情況下,類的建立(注意:不是例項!)會預設執行type類的__init__方法
如果對一個既指定元類和又指定基類的類來說,
例項化這個類的步驟為:1.執行元類的__call__方法,然後執行基類的__new__方法,最後才會執行此類的__init__方法
程式碼如下
程式碼借鑑自cookbook
當然,單例的實現不僅僅只有這幾種方法,剩下的你可以自己去探索一下了,畢竟知識嘛,還是要自己主動些。
本篇<完>!
我是一名奮戰在程式設計界的pythoner,工作中既要和資料打交道,也要和erp系統,web網站保持友好的溝通……時不時的會分享一些提高效率的程式設計小技巧,在實際應用中遇到的問題以及解決方案,或者原始碼的閱讀等等,歡迎大家一起來討論!如果覺得寫得還不錯,歡迎關注點贊,謝謝。
推薦文章
- 外媒爆,泰山隊200萬歐求購法甲鋒霸,這兩大外援中一人要騰位了
而在目前泰山隊的5大外援中,費萊尼和賈德松是有可能會被放棄了,而在這兩人中,費萊尼被放棄的可能性還是要更大一些的,此前費萊尼將要離隊的訊息已經是多次被報道了出來,可以說費萊尼的離開對於泰山隊影響並不大,因為費萊尼隨著年齡的增長實力已經是出現...
- 頭髮剪短和打薄有很大區別 愛美的女孩子快看過來
首先,將頭髮剪短,簡單的說就是將你的長頭髮變短,而且,隨著現在的人越來越追求美,短髮的造型也越來越多了,你可以將頭髮剪短之後再進行染燙,可以將髮尾燙卷做成內扣的形狀,也可以將整個頭髮燙卷做的比較的蓬鬆...
- 中醫治療精神分裂症(癲證)經方1則,益腎平肝
後世醫家對癲狂理論和治療有了進一步的發展,如《醫學正傳》認為狂為痰火實盛,癲為心血不足,狂宜下,癲宜安神養血,兼降痰火證治要決指出癲狂當治痰寧志張景嶽等醫家主張治癲宜解鬱化痰,寧心安神為主...