Flask框架單例模式實現(xiàn)方法詳解
本文實例講述了Flask框架單例模式實現(xiàn)方法。分享給大家供大家參考,具體如下:
單例模式:
程序運行時只能生成一個實例,避免對同一資源產(chǎn)生沖突的訪問請求。
Django admin.py下的admin.site.register() , site就是使用文件導(dǎo)入方式的單例模式
創(chuàng)建到單例模式4種方式:
- 1.文件導(dǎo)入
- 2. 類方式
- 3.基于__new__方式實現(xiàn)
- 4.基于metaclass方式實現(xiàn)
1.文件導(dǎo)入:
in single.py
class Singleton(): def __init__(self): pass site = Singleton()
類似:
import time 第一次已經(jīng)把導(dǎo)入的time模塊,放入內(nèi)存
import time 第二次內(nèi)存已有就不導(dǎo)入了
in app.py
from single.py import site #第一次導(dǎo)入,實例化site對象并放入內(nèi)存
in views.py
from single.py import site #第二次導(dǎo)入,直接從內(nèi)存拿。
2.類方式:
缺點:改變了單例的創(chuàng)建方式
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__方式實現(xiàn):
單例創(chuàng)建方式:
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方式實現(xiàn)
基于metaclass方式實現(xiàn)的原理:
- 1.對象是類創(chuàng)建,創(chuàng)建對象時候類的__init__方法自動執(zhí)行,對象()執(zhí)行類的 __call__ 方法
- 2.類是type創(chuàng)建,創(chuàng)建類時候type的__init__方法自動執(zhí)行,類() 執(zhí)行type的 __call__方法
單例創(chuàng)建方式:
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
希望本文所述對大家基于flask框架的Python程序設(shè)計有所幫助。
相關(guān)文章
Python多進(jìn)程Process和管道Pipe的使用方式
這篇文章主要介紹了Python多進(jìn)程Process和管道Pipe的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02使用python將mdb數(shù)據(jù)庫文件導(dǎo)入postgresql數(shù)據(jù)庫示例
mdb格式文件可以通過mdbtools工具將內(nèi)中包含的每張表導(dǎo)出到csv格式文件。由于access數(shù)據(jù)庫和postgresQL數(shù)據(jù)庫格式上會存在不通性,所以使用python的文件處理,將所得csv文件修改成正確、能識別的格式2014-02-02最新解決沒有NVSMI文件夾以及nvidia-smi‘?不是內(nèi)部或外部命令也不是可運行的程序或批處理文件
這篇文章主要介紹了解決沒有NVSMI文件夾以及nvidia-smi‘?不是內(nèi)部或外部命令也不是可運行的程序或批處理文件,本文通過兩種問題分析給大家分享解決方法,需要的朋友可以參考下2023-01-01python實現(xiàn)經(jīng)典排序算法的示例代碼
這篇文章主要介紹了python實現(xiàn)經(jīng)典排序算法的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02基于PyQt5制作Excel文件數(shù)據(jù)去重小工具
這篇文章主要介紹了如何利用PyQt5模塊制作一個Excel文件數(shù)據(jù)去重小工具,可以將單個或者多個Excel文件數(shù)據(jù)進(jìn)行去重操作,去重的列可以通過自定義制定,需要的可以參考一下2022-04-04利用Python-iGraph如何繪制貼吧/微博的好友關(guān)系圖詳解
這篇文章主要給大家介紹了關(guān)于利用Python-iGraph如何繪制貼吧/微博好友關(guān)系圖的相關(guān)資料,文中顯示介紹了在windows系統(tǒng)下安裝python-igraph的步驟,然后通過示例代碼演示了繪制好友關(guān)系圖的方法,需要的朋友可以參考下。2017-11-11