您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)Python下如何實現(xiàn)單例模式的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
Python 下的單例模式
要點:
1.某個類只能有一個實例;
2.它必須自行創(chuàng)建這個實例;
3.它必須自行向整個系統(tǒng)提供這個實例
方法:重寫new函數(shù)
應(yīng)該考慮的情況:
1.這個單例的類可能繼承了別的類
2.這個單例的類還有可能要接收參數(shù)來實例化
要點:
實例化的過程其實不是直接調(diào)用init的,首先是new分配一塊空間來創(chuàng)建實例,再由init對這個實例進行初始化.我們無法阻止new和init的調(diào)用,我們只能是限制他們的內(nèi)容,以此使他們能達到單例的目的
代碼:
class people(object): def __new__(cls,*args,**kargs): return super(people,cls).__new__(cls) def __init__(self,name): self.name = name def talk(self): print("hello,I am %s" %self.name) class student(people): def __new__(cls,*args,**kargs): if not hasattr(cls,"instance"): cls.instance = super(student,cls).__new__(cls,*args,**kargs) return cls.instance a = student("Timo") print(a) b = student("kysa") c = student("Luyi") a.talk() b.talk() print(c)
這里的輸出結(jié)果是:
<__main__.student object at 0x0000025AC48BF2E8>
hello,I am Luyi
hello,I am Luyi
<__main__.student object at 0x0000025AC48BF2E8>
可以確定的是: 確實是單例了,因為a的id和b,c的id是一致的
但是為什么:a先創(chuàng)建明明是Timo,可是為什么a的name變成了Luyi呢?
原因:
雖然確實是a這個實例,但是在最后c重新調(diào)用了new,返回了a的實例,再經(jīng)過init,改變了a的屬性,執(zhí)行時name ->Luyi.
解決:
這種情況下,我們只需要設(shè)置類變量,讓init在類變量的限制下,只對類進行一次有效的初始化.
代碼:
class people(object): def __new__(cls,*args,**kargs): return super(people,cls).__new__(cls) def __init__(self,name): self.name = name def talk(self): print("hello,I am %s" %self.name) class student(people): def __new__(cls,*args,**kargs): if not hasattr(cls,"instance"): cls.instance = super(student,cls).__new__(cls,*args,**kargs) return cls.instance def __init__(self,name): if not hasattr(self,"init_fir"): self.init_fir = True super(student,self).__init__(name) a = student("Timo") print(a) b = student("kysa") c = student("Luyi") a.talk() b.talk() print(c)
感謝各位的閱讀!關(guān)于“Python下如何實現(xiàn)單例模式”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。