目錄
一般情況下,類可以生成任意個例項,而單例模式只生成乙個例項
我們先用單例模式設計乙個rectangle類
然後用__new__方法設計單例模式,**如下
class rectangle:
def __init__(self,length,width):
self.length=length
self.width=width
def __new__(cls, *args, **kwargs):#__new__至少要有乙個引數cls,代表程式設計客棧要例項化的類
if not hasattr(cls,'obj'): #判斷類當中有沒有例項,如果沒有則新建
cls.obj=object.__new__(cls) #生成例項物件
return cls.obj
然後我們來驗證下,單例模式下是否只能生成乙個例項
rec1 = 程式設計客棧rectangle(10,8)#判斷類中沒有例項,則新建例項rec1
print(rec1.length,rec1.width)#這時候我們列印下rec1這個長方形的長和寬
>>>10 8#是我們輸入的值
rec2 = rectangle(6,4)
#rectangle已經建立過rec1例項了,所以不會再生成新的例項,此時的rec1和rec2指向是同乙個物件:rectangle(6www.cppcns.com,4)
print(rec1.length,rec1.width)#列印下rec1的長和寬
print(rec2程式設計客棧.length,rec2.width)#列印下rec2的長和寬
>>>
6 4
6 4
print(id(rec1)==id(rec2))
>>>ture #物件/例項只有乙個,只是賦給了不同的變數名
單例模式在程式設計中比較典型的應用場景:多個使用者同時呼叫某個模組時,會生成一些日誌,我們希望這些日誌存在同乙個檔案內,而不是多個檔案。
在生成日誌模組我們就可以採用單例模式進行設計。
概念:簡單來說就是可以利用字串來對映模組中的相應方法然後可以操作模組中相應的方法
我們以乙個飯店點菜的實際場景來理解python的反射機制
class food_list:#建立乙個飯店選單的類
def yxrs(self):
return '魚香肉絲'
def gbjd(self):
return '宮保雞丁'
def hspg(self):
return '紅燒排骨'
hasatter(物件,屬性或方法名)
判斷物件中是否有某個屬性或某個方法,返回值是布林型
guke1 = food_list()#例項化乙個顧客物件
while true:
diancai = input('請點菜: ')
if hasattr(guke1,diancai):#判斷顧客點的菜有沒有
print('好的,馬上去做')
break
else:
print('這個沒有,換個別的吧')
>>>請點菜: 佛跳牆
>>>這個沒有,換個別的吧
>>>請點菜: yxrs
>>>好的,馬上去做
getattr(物件,屬性或方法名,預設值) 判斷物件中是否有某個屬性或某個方法,如果有返回方法本身,沒有則返回預設值
guke1 = food_list()#例項化乙個顧客物件
def fun1():#定義乙個方法,用作getattr的預設值
return '沒有這道菜'
foodname = input('請輸入要翻譯的菜名:')
a = getattr(guke1,foodname,fun1)
#判斷guke1中有沒有foodname方法,有則返回這個方法,沒有則返回fun1方法
print(a())#執行返回的方法
>>>請輸入要翻譯的菜名:yxrs#guke1中有yxrs方法,則返回這個方法
>>>魚香肉絲
>>>請輸入要翻譯的菜名:dsfsfs#guke1中有沒有dsfsfs方法,則返回fun1方法
>>>沒有這道菜
setattr(物件,屬性,新值)
將例項的屬性改為新的值,如果屬性不存在則新建
我們給例項guke1加個**屬性
guke1 = food_list()#例項化乙個顧客物件
setattr(guke1,'proce','23元')
print(guke1.proce)
>>>
元本文標題: python中的單例模式與反射機制詳解
本文位址:
python中單例模式
一 單例模式設計基礎概念 單例模式 singleton pattern 是一種常用的軟體設計模式,該模式的主要目的是確保某乙個類只有乙個例項存在。當你希望在整個系統中,某個類只能出現乙個例項時,單例物件就能派上用場。目的 讓類建立物件,在系統中只有唯一的乙個實例子 每一次執行類名 返回的物件 記憶體...
python中的單例模式
單例模式 顧名思義是只有乙個例項記憶體位址,根據意思理解就是不論建立多少個例項物件,都只有乙個記憶體位址,單例模式是基於類的,是例項類物件,有別與 init init 是例項化物件.如下 domeclass single instance object instance none def init ...
Python 中的單例模式
單例就是解決在記憶體中始終只有乙個例項物件的問題,在python中實現起來很簡單,python中是通過new函式來分配記憶體的,舉個栗子 class musicplayer instance none def new cls,args,kwargs if cls.instance is none c...