Python中的單例模式與反射機(jī)制詳解
單例模式
一般情況下,類可以生成任意個(gè)實(shí)例,而單例模式只生成一個(gè)實(shí)例
我們先用單例模式設(shè)計(jì)一個(gè)Rectangle類
然后用__new__
方法設(shè)計(jì)單例模式,代碼如下
class Rectangle: def __init__(self,length,width): self.length=length self.width=width def __new__(cls, *args, **kwargs):#__new__至少要有一個(gè)參數(shù)cls,代表要實(shí)例化的類 if not hasattr(cls,'obj'): #判斷類當(dāng)中有沒有實(shí)例,如果沒有則新建 cls.obj=object.__new__(cls) #生成實(shí)例對(duì)象 return cls.obj
然后我們來驗(yàn)證下,單例模式下是否只能生成一個(gè)實(shí)例
rec1 = Rectangle(10,8)#判斷類中沒有實(shí)例,則新建實(shí)例rec1 print(rec1.length,rec1.width)#這時(shí)候我們打印下rec1這個(gè)長(zhǎng)方形的長(zhǎng)和寬 >>>10 8#是我們輸入的值 rec2 = Rectangle(6,4) #Rectangle已經(jīng)創(chuàng)建過rec1實(shí)例了,所以不會(huì)再生成新的實(shí)例,此時(shí)的rec1和rec2指向是同一個(gè)對(duì)象:Rectangle(6,4) print(rec1.length,rec1.width)#打印下rec1的長(zhǎng)和寬 print(rec2.length,rec2.width)#打印下rec2的長(zhǎng)和寬 >>> 6 4 6 4 print(id(rec1)==id(rec2)) >>>Ture #對(duì)象/實(shí)例只有一個(gè),只是賦給了不同的變量名
單例模式在程序設(shè)計(jì)中比較典型的應(yīng)用場(chǎng)景:多個(gè)用戶同時(shí)調(diào)用某個(gè)模塊時(shí),會(huì)生成一些日志,我們希望這些日志存在同一個(gè)文件內(nèi),而不是多個(gè)文件。
在生成日志模塊我們就可以采用單例模式進(jìn)行設(shè)計(jì)。
反射
概念:簡(jiǎn)單來說就是可以利用字符串來映射模塊中的相應(yīng)方法然后可以操作模塊中相應(yīng)的方法
我們以一個(gè)飯店點(diǎn)菜的實(shí)際場(chǎng)景來理解Python的反射機(jī)制
class Food_list:#創(chuàng)建一個(gè)飯店菜單的類 def yxrs(self): return '魚香肉絲' def gbjd(self): return '宮保雞丁' def hspg(self): return '紅燒排骨'
hasatter
hasatter
(對(duì)象,屬性或方法名)
判斷對(duì)象中是否有某個(gè)屬性或某個(gè)方法,返回值是布爾型
guke1 = Food_list()#實(shí)例化一個(gè)顧客對(duì)象 while True: diancai = input('請(qǐng)點(diǎn)菜: ') if hasattr(guke1,diancai):#判斷顧客點(diǎn)的菜有沒有 print('好的,馬上去做') break else: print('這個(gè)沒有,換個(gè)別的吧') >>>請(qǐng)點(diǎn)菜: 佛跳墻 >>>這個(gè)沒有,換個(gè)別的吧 >>>請(qǐng)點(diǎn)菜: yxrs >>>好的,馬上去做
getattr
getattr
(對(duì)象,屬性或方法名,缺省值) 判斷對(duì)象中是否有某個(gè)屬性或某個(gè)方法,如果有返回方法本身,沒有則返回缺省值
guke1 = Food_list()#實(shí)例化一個(gè)顧客對(duì)象 def fun1():#定義一個(gè)方法,用作getattr的缺省值 return '沒有這道菜' foodname = input('請(qǐng)輸入要翻譯的菜名:') a = getattr(guke1,foodname,fun1) #判斷guke1中有沒有foodname方法,有則返回這個(gè)方法,沒有則返回fun1方法 print(a())#執(zhí)行返回的方法 >>>請(qǐng)輸入要翻譯的菜名:yxrs#guke1中有yxrs方法,則返回這個(gè)方法 >>>魚香肉絲 >>>請(qǐng)輸入要翻譯的菜名:dsfsfs#guke1中有沒有dsfsfs方法,則返回fun1方法 >>>沒有這道菜
setattr
setattr
(對(duì)象,屬性,新值)
將實(shí)例的屬性改為新的值,如果屬性不存在則新建
我們給實(shí)例guke1加個(gè)價(jià)格屬性
guke1 = Food_list()#實(shí)例化一個(gè)顧客對(duì)象 setattr(guke1,'proce','23元') print(guke1.proce) >>> 23元
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
- Python的四種單例模式實(shí)現(xiàn)方式
- Python實(shí)現(xiàn)單例模式的四種方法
- Python 中單例模式的實(shí)現(xiàn)方法
- Python實(shí)現(xiàn)單例模式的五種寫法總結(jié)
- Python?reflect單例模式反射各個(gè)函數(shù)
- Python實(shí)現(xiàn)單例模式的四種方式詳解
- python設(shè)計(jì)模式之單例模式你了解多少
- Python實(shí)現(xiàn)單例模式的5種方法
- python單例模式的應(yīng)用場(chǎng)景實(shí)例講解
- Python單例模式的5種實(shí)現(xiàn)方式
相關(guān)文章
基于Python實(shí)現(xiàn)圖像文字識(shí)別OCR工具
在工作、生活中常常會(huì)用到,比如票據(jù)、漫畫、掃描件、照片的文本提取。本文主要介紹了基于PyQt + PaddleOCR實(shí)現(xiàn)的一個(gè)桌面端的OCR工具,用于快速實(shí)現(xiàn)圖片中文本區(qū)域自動(dòng)檢測(cè)+文本自動(dòng)識(shí)別,需要的朋友可以參考一下2021-12-12Python使用Tkinter制作一個(gè)進(jìn)制轉(zhuǎn)換工具
在平時(shí)工作學(xué)習(xí)當(dāng)中,我們經(jīng)常會(huì)編寫一些簡(jiǎn)單的 Python GUI 工具,以此來完成各種各樣的自動(dòng)化任務(wù),下面我們就來看看如何使用Python制作一個(gè)進(jìn)制轉(zhuǎn)換工具吧2024-01-01使用Python的Dataframe取兩列時(shí)間值相差一年的所有行方法
今天小編就為大家分享一篇使用Python的Dataframe取兩列時(shí)間值相差一年的所有行方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07python目標(biāo)檢測(cè)給圖畫框,bbox畫到圖上并保存案例
這篇文章主要介紹了python目標(biāo)檢測(cè)給圖畫框,bbox畫到圖上并保存案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03利用Python自制網(wǎng)頁并實(shí)現(xiàn)一鍵自動(dòng)生成探索性數(shù)據(jù)分析報(bào)告
這篇文章主要介紹了利用Python自制了網(wǎng)頁并實(shí)現(xiàn)一鍵自動(dòng)生成探索性數(shù)據(jù)分析報(bào)告,文章內(nèi)容具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-05-05Python中使用defaultdict和Counter的方法
本文深入探討了Python中的兩個(gè)強(qiáng)大工具——defaultdict和Counter,并詳細(xì)介紹了它們的工作原理、應(yīng)用場(chǎng)景以及在實(shí)際編程中的高效使用方法,感興趣的朋友跟隨小編一起看看吧2025-01-01