最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

常見的在Python中實(shí)現(xiàn)單例模式的三種方法

 更新時(shí)間:2015年04月08日 16:59:56   作者:吳文苑  
這篇文章主要介紹了常見的在Python中實(shí)現(xiàn)單例模式的三種方法,單例模式在各個(gè)編程語(yǔ)言的學(xué)習(xí)中都是需要掌握的基礎(chǔ)知識(shí),需要的朋友可以參考下

單例模式是一種常用的軟件設(shè)計(jì)模式。在它的核心結(jié)構(gòu)中只包含一個(gè)被稱為單例類的特殊類。通過單例模式可以保證系統(tǒng)中一個(gè)類只有一個(gè)實(shí)例而且該實(shí)例易于外界訪問,從而方便對(duì)實(shí)例個(gè)數(shù)的控制并節(jié)約系統(tǒng)資源。如果希望在系統(tǒng)中某個(gè)類的對(duì)象只能存在一個(gè),單例模式是最好的解決方案。

單例模式的要點(diǎn)有三個(gè);一是某個(gè)類只能有一個(gè)實(shí)例;二是它必須自行創(chuàng)建這個(gè)實(shí)例;三是它必須自行向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。在Python中,單例模式有以下幾種實(shí)現(xiàn)方式。

方法一、實(shí)現(xiàn)__new__方法,然后將類的一個(gè)實(shí)例綁定到類變量_instance上;如果cls._instance為None,則說明該類還沒有被實(shí)例化過,new一個(gè)該類的實(shí)例,并返回;如果cls._instance不為None,直接返回_instance,代碼如下:

class Singleton(object):
 
  def __new__(cls, *args, **kwargs):
    if not hasattr(cls, '_instance'):
      orig = super(Singleton, cls)
      cls._instance = orig.__new__(cls, *args, **kwargs)
    return cls._instance
 
class MyClass(Singleton):
  a = 1
 
one = MyClass()
two = MyClass()
 
#one和two完全相同,可以用id(), ==, is檢測(cè)
print id(one)  # 29097904
print id(two)  # 29097904
print one == two  # True
print one is two  # True

方法二、本質(zhì)上是方法一的升級(jí)版,使用__metaclass__(元類)的高級(jí)python用法,具體代碼如下:

class Singleton2(type):
 
  def __init__(cls, name, bases, dict):
    super(Singleton2, cls).__init__(name, bases, dict)
    cls._instance = None
 
  def __call__(cls, *args, **kwargs):
    if cls._instance is None:
      cls._instance = super(Singleton2, cls).__call__(*args, **kwargs)
    return cls._instance
 
class MyClass2(object):
  __metaclass__ = Singleton2
  a = 1
 
one = MyClass2()
two = MyClass2()
 
print id(one)  # 31495472
print id(two)  # 31495472
print one == two  # True
print one is two  # True


方法三、使用Python的裝飾器(decorator)實(shí)現(xiàn)單例模式,這是一種更Pythonic的方法;單利類本身的代碼不是單例的,通裝飾器使其單例化,代碼如下:

def singleton(cls, *args, **kwargs):
  instances = {}
  def _singleton():
    if cls not in instances:
      instances[cls] = cls(*args, **kwargs)
    return instances[cls]
  return _singleton
 
@singleton
class MyClass3(object):
  a = 1
 
one = MyClass3()
two = MyClass3()
 
print id(one)  # 29660784
print id(two)  # 29660784
print one == two  # True
print one is two  # True

相關(guān)文章

  • 詳解Python中高階函數(shù)(map,filter,reduce,sorted)的使用

    詳解Python中高階函數(shù)(map,filter,reduce,sorted)的使用

    高階函數(shù)就是能夠把函數(shù)當(dāng)成參數(shù)傳遞的函數(shù)就是高階函數(shù),換句話說如果一個(gè)函數(shù)的參數(shù)是函數(shù),那么這個(gè)函數(shù)就是一個(gè)高階函數(shù)。本文為大家詳細(xì)講解了Python中常用的四個(gè)高階函數(shù),感興趣的可以了解一下
    2022-04-04
  • python fuzzywuzzy模塊模糊字符串匹配詳細(xì)用法

    python fuzzywuzzy模塊模糊字符串匹配詳細(xì)用法

    這篇文章主要介紹了使用Python完成公司名稱和地址的模糊匹配的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 使用python生成大量數(shù)據(jù)寫入es數(shù)據(jù)庫(kù)并查詢操作(2)

    使用python生成大量數(shù)據(jù)寫入es數(shù)據(jù)庫(kù)并查詢操作(2)

    這篇文章主要介紹了使用python生成大量數(shù)據(jù)寫入es數(shù)據(jù)庫(kù)并查詢操作,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • Tornado 多進(jìn)程實(shí)現(xiàn)分析詳解

    Tornado 多進(jìn)程實(shí)現(xiàn)分析詳解

    這篇文章主要介紹了Tornado 多進(jìn)程實(shí)現(xiàn)分析詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • pytorch 轉(zhuǎn)換矩陣的維數(shù)位置方法

    pytorch 轉(zhuǎn)換矩陣的維數(shù)位置方法

    今天小編就為大家分享一篇pytorch 轉(zhuǎn)換矩陣的維數(shù)位置方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Django使用中間鍵實(shí)現(xiàn)csrf認(rèn)證詳解

    Django使用中間鍵實(shí)現(xiàn)csrf認(rèn)證詳解

    這篇文章主要介紹了Django使用中間鍵實(shí)現(xiàn)csrf認(rèn)證詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • PyCharm:method may be static問題及解決

    PyCharm:method may be static問題及解決

    這篇文章主要介紹了PyCharm:method may be static問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • python self,cls,decorator的理解

    python self,cls,decorator的理解

    在python里面,self, cls 不是關(guān)鍵字,完全可以使用自己寫的任意變量代替實(shí)現(xiàn)一樣的效果
    2009-07-07
  • python調(diào)用MySql保姆級(jí)圖文教程(包會(huì)的)

    python調(diào)用MySql保姆級(jí)圖文教程(包會(huì)的)

    MySQL是當(dāng)今市場(chǎng)上最受歡迎的數(shù)據(jù)庫(kù)系統(tǒng)之一,由于大多數(shù)應(yīng)用程序需要以某種形式與數(shù)據(jù)交互,因此像Python這樣的編程語(yǔ)言提供了用于存儲(chǔ)和訪問這些數(shù)據(jù)的工具,這篇文章主要給大家介紹了關(guān)于python調(diào)用MySql的相關(guān)資料,需要的朋友可以參考下
    2024-12-12
  • Python的ORM框架中SQLAlchemy庫(kù)的查詢操作的教程

    Python的ORM框架中SQLAlchemy庫(kù)的查詢操作的教程

    這篇文章主要介紹了Python的ORM框架中SQLAlchemy庫(kù)的查詢操作的教程,SQLAlchemy用來操作數(shù)據(jù)庫(kù)十分方便,需要的朋友可以參考下
    2015-04-04

最新評(píng)論

西畴县| 军事| 定兴县| 尼木县| 黄梅县| 九台市| 濮阳县| 澎湖县| 舟曲县| 兰州市| 宜章县| 扎兰屯市| 云霄县| 藁城市| 大埔区| 改则县| 崇州市| 衡水市| 阜宁县| 沾化县| 华蓥市| 册亨县| 通渭县| 轮台县| 唐海县| 文水县| 满城县| 淅川县| 枣阳市| 闽清县| 普宁市| 蓬溪县| 青阳县| 福鼎市| 台湾省| 宜宾市| 黄石市| 万全县| 定安县| 东丰县| 长武县|