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

Python 用__new__方法實(shí)現(xiàn)單例的操作

 更新時(shí)間:2020年12月11日 09:57:06   作者:hiudawn  
這篇文章主要介紹了Python 用__new__方法實(shí)現(xiàn)單例的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

介紹

init 方法通常用在初始化一個(gè)類實(shí)例時(shí)候,但其實(shí)它不是實(shí)例化一個(gè)類的時(shí)候第一個(gè)被調(diào)用 的方法。當(dāng)使用 Student(id, name) 這樣的表達(dá)式來(lái)實(shí)例化一個(gè)類時(shí),最先被調(diào)用的方法 其實(shí)是 new 方法。

new方法接受的參數(shù)雖然也是和init一樣,但init是在類實(shí)例創(chuàng)建之后調(diào)用,而 new方法正是創(chuàng)建這個(gè)類實(shí)例的方法。

new為對(duì)象分配空間,是內(nèi)置的靜態(tài)方法,new在內(nèi)存中為對(duì)象分配了空間也返回了對(duì)象的引用,init獲得了這個(gè)引用才初始化這個(gè)實(shí)例。

示例

一個(gè)非常簡(jiǎn)單的單例

class A:
 instance = None
 def __new__(cls, *args, **kwargs):
  if cls.instance is None:
   cls.instance = super().__new__(cls)
  return cls.instance

因?yàn)閚ew方法是一個(gè)靜態(tài)方法(也就是在定義的時(shí)候就沒(méi)有cls參數(shù)),所以在這里要傳入一個(gè)cls參數(shù),而且這里的new你改造過(guò)了,所以要返回爸爸的new方法。

按造這個(gè)方法改造的單例怎么new都是同一個(gè)實(shí)例,但init仍然會(huì)被執(zhí)行多次,也就是創(chuàng)建了幾個(gè)對(duì)象就調(diào)用幾次初始化方法。所以還要對(duì)init再進(jìn)行一些判斷。

class A:
 instance = None
 init_flag = False # 初始化標(biāo)記

 def __new__(cls, *args, **kwargs):
  if cls.instance is None:
   cls.instance = super().__new__(cls)
  return cls.instance

 def __init__(self):
  if A.init_flag:
   return
  print('執(zhí)行了初始化方法')
  A.init_flag = True

if __name__ == '__main__':
 a = A()
 b = A()
 print(a)
 print(b)

輸出結(jié)果:

執(zhí)行了初始化方法

<main.A object at 0x00000210E6F09320>

<main.A object at 0x00000210E6F09320>

總結(jié)

通過(guò)重載new方法,可以比較簡(jiǎn)單地實(shí)現(xiàn)單例,Python還有很多有趣的內(nèi)置函數(shù),有空可以再研究研究。

補(bǔ)充知識(shí):Python餓漢式和懶漢式單例模式的實(shí)現(xiàn)

看代碼吧~

# 餓漢式
class Singleton(object):
 # 重寫創(chuàng)建實(shí)例的__new__方法
 def __new__(cls):
  # 如果類沒(méi)有實(shí)例屬性,進(jìn)行實(shí)例化,否則返回實(shí)例
  if not hasattr(cls, 'instance'):
   cls.instance = super(Singleton, cls).__new__(cls)
  return cls.instance

餓漢式在創(chuàng)建的時(shí)候就會(huì)生成實(shí)例

# 懶漢式
class Singleton(object):
 __instance = None
 def __init__(self):
  if not self.__instance:
   print('調(diào)用__init__, 實(shí)例未創(chuàng)建')
  else:
   print('調(diào)用__init__,實(shí)例已經(jīng)創(chuàng)建過(guò)了:', __instance)

 @classmethod
 def get_instance(cls):
  # 調(diào)用get_instance類方法的時(shí)候才會(huì)生成Singleton實(shí)例
  if not cls.__instance:
   cls.__instance = Singleton()
  return cls.__instance

以上這篇Python 用__new__方法實(shí)現(xiàn)單例的操作就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • python如何尋找主串中所有指定子串下標(biāo)

    python如何尋找主串中所有指定子串下標(biāo)

    這篇文章主要介紹了python如何尋找主串中所有指定子串下標(biāo),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Python圖像處理之Hough圓形檢測(cè)

    Python圖像處理之Hough圓形檢測(cè)

    霍夫變換是一種特征檢測(cè)(feature extraction),被廣泛應(yīng)用在圖像分析,本文將利用Hough變換實(shí)現(xiàn)圓形檢測(cè),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-07-07
  • python實(shí)現(xiàn)給數(shù)組按片賦值的方法

    python實(shí)現(xiàn)給數(shù)組按片賦值的方法

    這篇文章主要介紹了python實(shí)現(xiàn)給數(shù)組按片賦值的方法,實(shí)例分析了Python在指定位置進(jìn)行賦值的相關(guān)技巧,需要的朋友可以參考下
    2015-07-07
  • slearn缺失值處理器之Imputer詳析

    slearn缺失值處理器之Imputer詳析

    這篇文章主要給大家介紹了關(guān)于slearn缺失值處理器之Imputer的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-08-08
  • Python使用urllib模塊的urlopen超時(shí)問(wèn)題解決方法

    Python使用urllib模塊的urlopen超時(shí)問(wèn)題解決方法

    這篇文章主要介紹了Python使用urllib模塊的urlopen超時(shí)問(wèn)題解決方法,本文使用socket模塊中的setdefaulttimeout函數(shù)解決了超時(shí)問(wèn)題,需要的朋友可以參考下
    2014-11-11
  • python opencv讀mp4視頻的實(shí)例

    python opencv讀mp4視頻的實(shí)例

    今天小編就為大家分享一篇python opencv讀mp4視頻的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • python 多線程中子線程和主線程相互通信方法

    python 多線程中子線程和主線程相互通信方法

    今天小編就為大家分享一篇python 多線程中子線程和主線程相互通信方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • 層次分析法在matlab上的實(shí)現(xiàn)方式

    層次分析法在matlab上的實(shí)現(xiàn)方式

    這篇文章主要介紹了層次分析法在matlab上的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Python如何繪制日歷圖和熱力圖

    Python如何繪制日歷圖和熱力圖

    這篇文章主要介紹了Python如何繪制日歷圖和熱力圖,幫助大家更好的理解和學(xué)習(xí)Python,感興趣的朋友可以了解下
    2020-08-08
  • Python實(shí)現(xiàn)提取谷歌音樂(lè)搜索結(jié)果的方法

    Python實(shí)現(xiàn)提取谷歌音樂(lè)搜索結(jié)果的方法

    這篇文章主要介紹了Python實(shí)現(xiàn)提取谷歌音樂(lè)搜索結(jié)果的方法,涉及Python針對(duì)谷歌音樂(lè)相關(guān)信息的獲取技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07

最新評(píng)論