簡單了解python單例模式的幾種寫法
方法一:使用裝飾器
裝飾器維護一個字典對象instances,緩存了所有單例類,只要單例不存在則創(chuàng)建,已經(jīng)存在直接返回該實例對象。
def singleton(cls):
instances = {}
def wrapper(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return wrapper
@singleton
class Foo(object):
pass
foo1 = Foo()
foo2 = Foo()
print foo1 is foo2
方法二:使用基類
__new__是真正創(chuàng)建實例對象的方法,所以重寫基類的__new__方法,以此來保證創(chuàng)建對象的時候只生成一個實例
class Singleton(object): def __new__(cls, *args, **kwargs): if not hasattr(cls, '_instance'): cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs) return cls._instance class Foo(Singleton): pass foo1 = Foo() foo2 = Foo() print foo1 is foo2 # True
方法三:使用元類
元類(參考:深刻理解Python中的元類)是用于創(chuàng)建類對象的類,類對象創(chuàng)建實例對象時一定會調用__call__方法,因此在調用__call__時候保證始終只創(chuàng)建一個實例即可,type是python中的一個元類。
class Singleton(type): def __call__(cls, *args, **kwargs): if not hasattr(cls, '_instance'): cls._instance = super(Singleton, cls).__call__(*args, **kwargs) return cls._instance class Foo(object): __metaclass__ = Singleton foo1 = Foo() foo2 = Foo() print foo1 is foo2 # True
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Python調用高德API實現(xiàn)批量地址轉經(jīng)緯度并寫入表格的功能
這篇文章主要介紹了Python調用高德API實現(xiàn)批量地址轉經(jīng)緯度并寫入表格的功能,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01
Numpy實現(xiàn)卷積神經(jīng)網(wǎng)絡(CNN)的示例
這篇文章主要介紹了Numpy實現(xiàn)卷積神經(jīng)網(wǎng)絡(CNN)的示例,幫助大家更好的理解和使用Numpy,感興趣的朋友可以了解下2020-10-10
使用Python實現(xiàn)一個優(yōu)雅的異步定時器
在 Python 中實現(xiàn)定時器功能是一個常見需求,尤其是在需要周期性執(zhí)行任務的場景下,本文給大家介紹了基于 asyncio 和 threading 模塊,可擴展的異步定時器實現(xiàn),需要的朋友可以參考下2025-04-04

