欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python單體模式的幾種常見實現(xiàn)方法詳解

 更新時間:2017年07月28日 10:27:28   作者:羅兵  
這篇文章主要介紹了Python單體模式的幾種常見實現(xiàn)方法,結(jié)合實例形式分析了Python單體模式的實現(xiàn)方法、原理與相關(guān)注意事項,需要的朋友可以參考下

本文實例講述了Python單體模式的幾種常見實現(xiàn)方法。分享給大家供大家參考,具體如下:

這里python實現(xiàn)的單體模式,參考了:https://stackoverflow.com/questions/1363839/python-singleton-object-instantiation/1363852#1363852

一、修改父類的 __dict__

class Borg:
  _shared_state = {}
  def __init__(self):
    self.__dict__ = self._shared_state
class Singleton(Borg):
  def __init__(self, name):
    super().__init__()
    self.name = name
  def __str__(self):
    return self.name
x = Singleton('sausage')
print(x)
y = Singleton('eggs')
print(y)
z = Singleton('spam')
print(z)
print(x)
print(y)

注意,這種方法實現(xiàn)的并非真正的單體模式!!

下面幾種方法實現(xiàn)的才是真正的單體模式

二、使用元類

先看看這里關(guān)于元類的描述:

元類一般用于創(chuàng)建類。

在執(zhí)行類定義時,解釋器必須要知道這個類的正確的元類。解釋器會先尋找類屬性__metaclass__,如果此屬性存在,就將這個屬性賦值給此類作為它的元類。如果此屬性沒有定義,它會向上查找父類中的__metaclass__。如果還沒有發(fā)現(xiàn)__metaclass__屬性,解釋器會檢查名字為__metaclass__的全局變量,如果它存在,就使用它作為元類。否則, 使用內(nèi)置的 type 作為此類的元類。

1. 繼承 type,使用 __call__

注意__call__的參數(shù)

class Singleton(type):
  _instance = None
  def __call__(self, *args, **kw):
    if self._instance is None:
      self._instance = super().__call__(*args, **kw)
    return self._instance
class MyClass(object):
  __metaclass__ = Singleton
print(MyClass())
print(MyClass())

2. 繼承 type,使用 __new__

注意__new__的參數(shù)

class Singleton(type):
  _instance = None
  def __new__(cls, name, bases, dct):
    if cls._instance is None:
      cls._instance = super().__new__(cls, name, bases, dct)
    return cls._instance
class MyClass(object):
  __metaclass__ = Singleton
print(MyClass())
print(MyClass())

3. 繼承 object,使用 __new__

注意__new__的參數(shù)

class Singleton(object):
  _instance = None
  def __new__(cls):
    if cls._instance is None:
      cls._instance = super().__new__(cls)
    return cls._instance
class MyClass(object):
  __metaclass__ = Singleton
print(MyClass())
print(MyClass())

下面還有一個很巧妙的方法實現(xiàn)單體模式

使用類方法classmethod

class Singleton:
  _instance = None
  @classmethod
  def create(cls):
    if cls._instance is None:
      cls._instance = cls()
    return cls._instance
  def __init__(self):
    self.x = 5    # or whatever you want to do
sing = Singleton.create()
print(sing.x) # 5
sec = Singleton.create()
print(sec.x) # 5

更多關(guān)于Python相關(guān)內(nèi)容可查看本站專題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python Socket編程技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程

希望本文所述對大家Python程序設(shè)計有所幫助。

相關(guān)文章

  • python如何求解兩數(shù)的最大公約數(shù)

    python如何求解兩數(shù)的最大公約數(shù)

    這篇文章主要為大家詳細(xì)介紹了python如何求解兩數(shù)的最大公約數(shù),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • pyqt5實現(xiàn)登錄界面的模板

    pyqt5實現(xiàn)登錄界面的模板

    這篇文章主要為大家詳細(xì)介紹了pyqt5登錄界面的實現(xiàn)模板,通過登錄界面打開主界面的實現(xiàn)方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • Python 編程語言詳細(xì)介紹

    Python 編程語言詳細(xì)介紹

    這篇文章主要分享的是 Python 編程語言的詳細(xì)介紹,Python 由 Guido van Rossum 設(shè)計,作為“ABC”編程語言的繼承者,于 1991 年首次發(fā)布。它是一種高級通用語言,其設(shè)計理念是通過使用縮進(jìn)來強調(diào)代碼的可讀性。文章具有一定的參考價值,需要的朋友可以參考一下
    2021-11-11
  • Jupyter notebook運行Spark+Scala教程

    Jupyter notebook運行Spark+Scala教程

    這篇文章主要介紹了Jupyter notebook運行Spark+Scala教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • 對python中的乘法dot和對應(yīng)分量相乘multiply詳解

    對python中的乘法dot和對應(yīng)分量相乘multiply詳解

    今天小編就為大家分享一篇對python中的乘法dot和對應(yīng)分量相乘multiply詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • python基礎(chǔ)教程之實現(xiàn)石頭剪刀布游戲示例

    python基礎(chǔ)教程之實現(xiàn)石頭剪刀布游戲示例

    使用PYTHON設(shè)計一個"石頭,剪子,布"游戲,有時又叫"Rochambeau",下面是實現(xiàn)方法,需要的朋友可以參考下
    2014-02-02
  • python微信公眾號之關(guān)注公眾號自動回復(fù)

    python微信公眾號之關(guān)注公眾號自動回復(fù)

    這篇文章主要為大家詳細(xì)介紹了python微信公眾號之關(guān)注公眾號自動回復(fù),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • python 讀寫excel文件操作示例【附源碼下載】

    python 讀寫excel文件操作示例【附源碼下載】

    這篇文章主要介紹了python 讀寫excel文件操作,結(jié)合實例形式分析了Python基于xlutils導(dǎo)入xlrd,xlwt庫操作Excel相關(guān)實現(xiàn)技巧,并附帶源碼供讀者下載參考,需要的朋友可以參考下
    2019-06-06
  • python實現(xiàn)超市管理系統(tǒng)(后臺管理)

    python實現(xiàn)超市管理系統(tǒng)(后臺管理)

    這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)超市管理系統(tǒng),增加后臺管理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • python sklearn中tsne算法降維結(jié)果不一致問題的解決方法

    python sklearn中tsne算法降維結(jié)果不一致問題的解決方法

    最近在做一個文本聚類的分析,在對文本數(shù)據(jù)embedding后,想著看下數(shù)據(jù)的分布,于是用sklearn的TSNE算法來降維embedding后的數(shù)據(jù)結(jié)果,當(dāng)在多次執(zhí)行后,竟發(fā)現(xiàn)TSNE的結(jié)果竟然變了,而且每次都不一樣,所以本文就給大家講講如何解決sklearn中tsne算法降維結(jié)果不一致的問題
    2023-10-10

最新評論