您好,登錄后才能下訂單哦!
使用Flask框架怎么實現單例模式?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
單例模式:
程序運行時只能生成一個實例,避免對同一資源產生沖突的訪問請求。
Django admin.py下的admin.site.register() , site就是使用文件導入方式的單例模式
創建到單例模式4種方式:
1.文件導入
2. 類方式
3.基于__new__方式實現
4.基于metaclass方式實現
1.文件導入:
in single.py
class Singleton(): def __init__(self): pass site = Singleton()
類似:
import time 第一次已經把導入的time模塊,放入內存
import time 第二次內存已有就不導入了
in app.py
from single.py import site #第一次導入,實例化site對象并放入內存
in views.py
from single.py import site #第二次導入,直接從內存拿。
2.類方式:
缺點:改變了單例的創建方式
obj = Singleton.instance()
# 單例模式:無法支持多線程情況 import time class Singleton(object): def __init__(self): import time time.sleep(1) @classmethod def instance(cls, *args, **kwargs): if not hasattr(Singleton, "_instance"): Singleton._instance = Singleton(*args, **kwargs) return Singleton._instance # # 單例模式:支持多線程情況 import time import threading class Singleton(object): _instance_lock = threading.Lock() def __init__(self): time.sleep(1) @classmethod def instance(cls, *args, **kwargs): if not hasattr(Singleton, "_instance"): with Singleton._instance_lock: if not hasattr(Singleton, "_instance"): Singleton._instance = Singleton(*args, **kwargs) return Singleton._instance
3.基于__new__方式實現:
單例創建方式:
obj1 = Singleton() obj2 = Singleton()
import time import threading class Singleton(object): _instance_lock = threading.Lock() def __init__(self): pass def __new__(cls, *args, **kwargs): if not hasattr(Singleton, "_instance"): with Singleton._instance_lock: if not hasattr(Singleton, "_instance"): Singleton._instance = object.__new__(cls, *args, **kwargs) return Singleton._instance
4.基于metaclass方式實現
基于metaclass方式實現的原理:
1.對象是類創建,創建對象時候類的__init__方法自動執行,對象()執行類的 __call__ 方法
2.類是type創建,創建類時候type的__init__方法自動執行,類() 執行type的 __call__方法
單例創建方式:
obj1 = Foo() obj2 = Foo()
import threading class SingletonType(type): _instance_lock = threading.Lock() def __call__(cls, *args, **kwargs): if not hasattr(cls, "_instance"): with SingletonType._instance_lock: if not hasattr(cls, "_instance"): cls._instance = super(SingletonType,cls).__call__(*args, **kwargs) return cls._instance class Foo(metaclass=SingletonType): def __init__(self): pass
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。