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

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

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

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

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

方法一、實現(xiàn)__new__方法,然后將類的一個實例綁定到類變量_instance上;如果cls._instance為None,則說明該類還沒有被實例化過,new一個該類的實例,并返回;如果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檢測
print id(one)  # 29097904
print id(two)  # 29097904
print one == two  # True
print one is two  # True

方法二、本質(zhì)上是方法一的升級版,使用__metaclass__(元類)的高級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)實現(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ù)當成參數(shù)傳遞的函數(shù)就是高階函數(shù),換句話說如果一個函數(shù)的參數(shù)是函數(shù),那么這個函數(shù)就是一個高階函數(shù)。本文為大家詳細講解了Python中常用的四個高階函數(shù),感興趣的可以了解一下
    2022-04-04
  • python fuzzywuzzy模塊模糊字符串匹配詳細用法

    python fuzzywuzzy模塊模糊字符串匹配詳細用法

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

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

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

    Tornado 多進程實現(xiàn)分析詳解

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

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

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

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

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

    PyCharm:method may be static問題及解決

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

    python self,cls,decorator的理解

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

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

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

    Python的ORM框架中SQLAlchemy庫的查詢操作的教程

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

最新評論

清流县| 乐清市| 习水县| 汽车| 马山县| 邹城市| 常州市| 敦煌市| 开原市| 临颍县| 玉门市| 山阴县| 陈巴尔虎旗| 晋江市| 临沭县| 阿克苏市| 武乡县| 盈江县| 杭州市| 民县| 永昌县| 娱乐| 灵寿县| 定边县| 汶上县| 化德县| 西盟| 和顺县| 曲周县| 千阳县| 荔波县| 罗山县| 连城县| 分宜县| 江阴市| 宣威市| 大庆市| 康保县| 桂东县| 泽普县| 开封县|