欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

5種Python單例模式的實現方式

系統 2041 0

本文為大家分享了Python創建單例模式的5種常用方法,供大家參考,具體內容如下

所謂單例,是指一個類的實例從始至終只能被創建一次。
方法1:
如果想使得某個類從始至終最多只有一個實例,使用__new__方法會很簡單。Python中類是通過__new__來創建實例的:

            
class Singleton(object):
  def __new__(cls,*args,**kwargs):
    if not hasattr(cls,'_inst'):
      cls._inst=super(Singleton,cls).__new__(cls,*args,**kwargs)
    return cls._inst
if __name__=='__main__':
  class A(Singleton):
    def __init__(self,s):
      self.s=s   
  a=A('apple')  
  b=A('banana')
  print id(a),a.s
  print id(b),b.s

          

結果:
29922256 banana
29922256 banana
通過__new__方法,將類的實例在創建的時候綁定到類屬性_inst上。如果cls._inst為None,說明類還未實例化,實例化并將實例綁定到cls._inst,以后每次實例化的時候都返回第一次實例化創建的實例。注意從Singleton派生子類的時候,不要重載__new__。
方法2:
有時候我們并不關心生成的實例是否具有同一id,而只關心其狀態和行為方式。我們可以允許許多個實例被創建,但所有的實例都共享狀態和行為方式:

            
class Borg(object):
  _shared_state={}
  def __new__(cls,*args,**kwargs):
    obj=super(Borg,cls).__new__(cls,*args,**kwargs)
    obj.__dict__=cls._shared_state
    return obj

          

將所有實例的__dict__指向同一個字典,這樣實例就共享相同的方法和屬性。對任何實例的名字屬性的設置,無論是在__init__中修改還是直接修改,所有的實例都會受到影響。不過實例的id是不同的。要保證類實例能共享屬性,但不和子類共享,注意使用cls._shared_state,而不是Borg._shared_state。
因為實例是不同的id,所以每個實例都可以做字典的key:

            
if __name__=='__main__':
  class Example(Borg):
    pass
  a=Example()
  b=Example()
  c=Example()
  adict={}
  j=0
  for i in a,b,c:
    adict[i]=j
    j+=1
  for i in a,b,c:
    print adict[i]

          

結果:
0
1
2
如果這種行為不是你想要的,可以為Borg類添加__eq__和__hash__方法,使其更接近于單例模式的行為:

            
class Borg(object):
  _shared_state={}
  def __new__(cls,*args,**kwargs):
    obj=super(Borg,cls).__new__(cls,*args,**kwargs)
    obj.__dict__=cls._shared_state
    return obj
  def __hash__(self):
    return 1
  def __eq__(self,other):
    try:
      return self.__dict__ is other.__dict__
    except:
      return False
if __name__=='__main__':
  class Example(Borg):
    pass
  a=Example()
  b=Example()
  c=Example()
  adict={}
  j=0
  for i in a,b,c:
    adict[i]=j
    j+=1
  for i in a,b,c:
    print adict[i]

          

結果:
2
2
2
所有的實例都能當一個key使用了。
方法3
當你編寫一個類的時候,某種機制會使用類名字,基類元組,類字典來創建一個類對象。新型類中這種機制默認為type,而且這種機制是可編程的,稱為元類__metaclass__ 。

            
class Singleton(type):
  def __init__(self,name,bases,class_dict):
    super(Singleton,self).__init__(name,bases,class_dict)
    self._instance=None
  def __call__(self,*args,**kwargs):
    if self._instance is None:
      self._instance=super(Singleton,self).__call__(*args,**kwargs)
    return self._instance
if __name__=='__main__':
  class A(object):
    __metaclass__=Singleton    
  a=A()
  b=A()
  print id(a),id(b)

          

結果:
34248016 34248016
id是相同的。
例子中我們構造了一個Singleton元類,并使用__call__方法使其能夠模擬函數的行為。構造類A時,將其元類設為Singleton,那么創建類對象A時,行為發生如下:
A=Singleton(name,bases,class_dict),A其實為Singleton類的一個實例。
創建A的實例時,A()=Singleton(name,bases,class_dict)()=Singleton(name,bases,class_dict).__call__(),這樣就將A的所有實例都指向了A的屬性_instance上,這種方法與方法1其實是相同的。
?方法4
python中的模塊module在程序中只被加載一次,本身就是單例的??梢灾苯訉懸粋€模塊,將你需要的方法和屬性,寫在模塊中當做函數和模塊作用域的全局變量即可,根本不需要寫類。
而且還有一些綜合模塊和類的優點的方法:

            
class _singleton(object):
  class ConstError(TypeError):
    pass
  def __setattr__(self,name,value):
    if name in self.__dict__:
      raise self.ConstError
    self.__dict__[name]=value
  def __delattr__(self,name):
    if name in self.__dict__:
      raise self.ConstError
    raise NameError
import sys
sys.modules[__name__]=_singleton()

          

python并不會對sys.modules進行檢查以確保他們是模塊對象,我們利用這一點將模塊綁定向一個類對象,而且以后都會綁定向同一個對象了。
將代碼存放在single.py中:

            
>>> import single
>>> single.a=1
>>> single.a=2

          

ConstError
>>> del single.a
ConstError
方法5:
最簡單的方法:

            
class singleton(object):
  pass
singleton=singleton()

          

將名字singleton綁定到實例上,singleton就是它自己類的唯一對象了。

以上就是Python單例模式的實現方式詳細介紹,希望對大家的學習有所幫助。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。。?/p>

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产一区二区三区免费 | 亚洲人人爱 | 午夜免费观看福利片一区二区三区 | 成人一区二区三区 | 一级毛片私人影院老司机 | 亚洲一区在线观看视频 | 国产一区不卡 | 久久久精品国产 | 黄色综合 | 夜夜操av | 亚洲欧美日韩在线 | 色艹 | 日本免费视频在线观看 | 奇米色777欧美一区二区 | 欧美日韩在线一区二区三区 | 99这里只有精品视频 | 在线观看日韩中文字幕 | 亚洲另类天天更新影院在线观看 | 亚洲一区二区在线播放 | 欧美精品导航 | 国产精品亚洲综合色拍 | 亚洲天堂影院 | 精品一区二区三区免费视频 | 国产精品a在线观看香蕉 | 亚洲婷婷国产精品电影人久久 | 波多野结衣中文丝袜字幕 | 精品人人 | 一区二区三区国产在线 | 麻豆国产一区二区三区四区 | 国产一区二区视频在线观看 | 秋霞久久网 | 国产99久久精品一区二区永久免费 | 成人精品鲁一区一区二区 | 一级特黄女人生活片 | 日本不卡在线视频 | 999热视频| 好吊色欧美一区二区三区四区 | 国产精品久久久久久一级毛片 | 精品成人免费 | 国产精品久久久久久亚洲伦理 | 中文字幕在线二区 |