溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

使用Flask框架怎么實(shí)現(xiàn)單例模式

發(fā)布時(shí)間:2021-04-13 16:30:33 來(lái)源:億速云 閱讀:536 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

使用Flask框架怎么實(shí)現(xiàn)單例模式?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

單例模式:

程序運(yùn)行時(shí)只能生成一個(gè)實(shí)例,避免對(duì)同一資源產(chǎn)生沖突的訪問(wèn)請(qǐng)求。

Django   admin.py下的admin.site.register() ,  site就是使用文件導(dǎo)入方式的單例模式

創(chuàng)建到單例模式4種方式:

  • 1.文件導(dǎo)入

  • 2. 類(lèi)方式

  • 3.基于__new__方式實(shí)現(xiàn)

  • 4.基于metaclass方式實(shí)現(xiàn)

1.文件導(dǎo)入:

in  single.py

class Singleton():
  def __init__(self):
    pass
site = Singleton()

類(lèi)似:

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)入,實(shí)例化site對(duì)象并放入內(nèi)存

in  views.py

from single.py import site #第二次導(dǎo)入,直接從內(nèi)存拿。

2.類(lèi)方式:

缺點(diǎn):改變了單例的創(chuàng)建方式

obj = Singleton.instance()
# 單例模式:無(wú)法支持多線程情況
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__方式實(shí)現(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方式實(shí)現(xiàn)

基于metaclass方式實(shí)現(xiàn)的原理:

  • 1.對(duì)象是類(lèi)創(chuàng)建,創(chuàng)建對(duì)象時(shí)候類(lèi)的__init__方法自動(dòng)執(zhí)行,對(duì)象()執(zhí)行類(lèi)的 __call__ 方法

  • 2.類(lèi)是type創(chuàng)建,創(chuàng)建類(lèi)時(shí)候type的__init__方法自動(dòng)執(zhí)行,類(lèi)() 執(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

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI