Python實現(xiàn)單例模式的5種方法
一個對象只允許被一次創(chuàng)建,一個類只能創(chuàng)建一個對象,并且提供一個全局訪問點。
單例模式應該是應用最廣泛,實現(xiàn)最簡單的一種創(chuàng)建型模式。
特點:全局唯一,允許更改
優(yōu)缺點優(yōu)點:
避免對資源的多重占用,如寫入文件操作 節(jié)省內(nèi)存 防止命名空間被污染缺點:
沒有接口,不能繼承,與單一職責原則沖突,一個類應該只關心內(nèi)部邏輯,而不關心外面怎么樣來實例化Python實現(xiàn)方式1,元類實現(xiàn):class MetaClass(type): def __call__(self, *args, **kwargs):'''self : class Singleton'''if not hasattr(self, 'ins'): insObject = super(__class__, self).__call__(*args, **kwargs) setattr(self, 'ins', insObject)return getattr(self, 'ins')class Singleton(object, metaclass=MetaClass): passif __name__ == '__main__': ins = Singleton() print(id(ins)) ins = Singleton() print(id(ins))方式2,繼承實現(xiàn):
class ParentClass: def __new__(cls, *args, **kwargs) -> object:'''cls : class Singeton'''if not hasattr(cls, 'ins'): insObject = super(__class__, cls).__new__(cls, *args, **kwargs) setattr(cls, 'ins', insObject)return getattr(cls, 'ins')class Singleton(ParentClass): passif __name__ == '__main__': ins = Singleton() print(id(ins)) ins = Singleton() print(id(ins))方式3,裝飾器實現(xiàn):
def warpper(clsObject): def inner(*args, **kwargs):if not hasattr(clsObject, 'ins'): insObject = clsObject(*args, **kwargs) setattr(clsObject, 'ins', insObject)return getattr(clsObject, 'ins') return inner@warpperclass Singleton: passif __name__ == '__main__': ins = Singleton() print(id(ins)) ins = Singleton() print(id(ins))方式4,模塊實現(xiàn):
- foo.py --> ins = Singleton()- bar.py --> from foo import ins方式5,@classmethod實現(xiàn)單例模式:
class Singleton: @classmethod def getSingletonInstanceObject(cls, *args, **kwargs):if not hasattr(cls, 'ins'): insObject = cls(*args, **kwargs) setattr(cls, 'ins', insObject)return getattr(cls, 'ins')if __name__ == '__main__': ins = Singleton.getSingletonInstanceObject() print(id(ins)) ins = Singleton.getSingletonInstanceObject() print(id(ins))
到此這篇關于Python實現(xiàn)單例模式的5種方法的文章就介紹到這了,更多相關Python 單例模式內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持好吧啦網(wǎng)!
相關文章:
1. 使用Python webdriver圖書館搶座自動預約的正確方法2. Python sublime安裝及配置過程詳解3. Linux刪除系統(tǒng)自帶版本Python過程詳解4. Python3 json模塊之編碼解碼方法講解5. ASP基礎知識VBScript基本元素講解6. python 使用事件對象asyncio.Event來同步協(xié)程的操作7. Java Long類型對比分析8. Python 合并拼接字符串的方法9. ASP.NET MVC使用jQuery ui的progressbar實現(xiàn)進度條10. Python字符串到字節(jié)的轉(zhuǎn)換。雙反斜杠問題

網(wǎng)公網(wǎng)安備