日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

Python单例模式的4种实现方法

發(fā)布時(shí)間:2023/12/2 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python单例模式的4种实现方法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
[python]?view plaincopy
  • #-*-?encoding=utf-8?-*-??
  • print?'----------------------方法1--------------------------'??
  • #方法1,實(shí)現(xiàn)__new__方法??
  • #并在將一個(gè)類的實(shí)例綁定到類變量_instance上,??
  • #如果cls._instance為None說(shuō)明該類還沒(méi)有實(shí)例化過(guò),實(shí)例化該類,并返回??
  • #如果cls._instance不為None,直接返回cls._instance??
  • class?Singleton(object):??
  • ????def?__new__(cls,?*args,?**kw):??
  • ????????if?not?hasattr(cls,?'_instance'):??
  • ????????????orig?=?super(Singleton,?cls)??
  • ????????????cls._instance?=?orig.__new__(cls,?*args,?**kw)??
  • ????????return?cls._instance??
  • ??
  • class?MyClass(Singleton):??
  • ????a?=?1??
  • ??
  • one?=?MyClass()??
  • two?=?MyClass()??
  • ??
  • two.a?=?3??
  • print?one.a??
  • #3??
  • #one和two完全相同,可以用id(),?==,?is檢測(cè)??
  • print?id(one)??
  • #29097904??
  • print?id(two)??
  • #29097904??
  • print?one?==?two??
  • #True??
  • print?one?is?two??
  • #True??
  • ??
  • print?'----------------------方法2--------------------------'??
  • #方法2,共享屬性;所謂單例就是所有引用(實(shí)例、對(duì)象)擁有相同的狀態(tài)(屬性)和行為(方法)??
  • #同一個(gè)類的所有實(shí)例天然擁有相同的行為(方法),??
  • #只需要保證同一個(gè)類的所有實(shí)例具有相同的狀態(tài)(屬性)即可??
  • #所有實(shí)例共享屬性的最簡(jiǎn)單最直接的方法就是__dict__屬性指向(引用)同一個(gè)字典(dict)??
  • #可參看:http://code.activestate.com/recipes/66531/??
  • class?Borg(object):??
  • ????_state?=?{}??
  • ????def?__new__(cls,?*args,?**kw):??
  • ????????ob?=?super(Borg,?cls).__new__(cls,?*args,?**kw)??
  • ????????ob.__dict__?=?cls._state??
  • ????????return?ob??
  • ??
  • class?MyClass2(Borg):??
  • ????a?=?1??
  • ??
  • one?=?MyClass2()??
  • two?=?MyClass2()??
  • ??
  • #one和two是兩個(gè)不同的對(duì)象,id,?==,?is對(duì)比結(jié)果可看出??
  • two.a?=?3??
  • print?one.a??
  • #3??
  • print?id(one)??
  • #28873680??
  • print?id(two)??
  • #28873712??
  • print?one?==?two??
  • #False??
  • print?one?is?two??
  • #False??
  • #但是one和two具有相同的(同一個(gè)__dict__屬性),見(jiàn):??
  • print?id(one.__dict__)??
  • #30104000??
  • print?id(two.__dict__)??
  • #30104000??
  • ??
  • print?'----------------------方法3--------------------------'??
  • #方法3:本質(zhì)上是方法1的升級(jí)(或者說(shuō)高級(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,?**kw):??
  • ????????if?cls._instance?is?None:??
  • ????????????cls._instance?=?super(Singleton2,?cls).__call__(*args,?**kw)??
  • ????????return?cls._instance??
  • ??
  • class?MyClass3(object):??
  • ????__metaclass__?=?Singleton2??
  • ??
  • one?=?MyClass3()??
  • two?=?MyClass3()??
  • ??
  • two.a?=?3??
  • print?one.a??
  • #3??
  • print?id(one)??
  • #31495472??
  • print?id(two)??
  • #31495472??
  • print?one?==?two??
  • #True??
  • print?one?is?two??
  • #True??
  • ??
  • print?'----------------------方法4--------------------------'??
  • #方法4:也是方法1的升級(jí)(高級(jí))版本,??
  • #使用裝飾器(decorator),??
  • #這是一種更pythonic,更elegant的方法,??
  • #單例類本身根本不知道自己是單例的,因?yàn)樗旧?自己的代碼)并不是單例的??
  • def?singleton(cls,?*args,?**kw):??
  • ????instances?=?{}??
  • ????def?_singleton():??
  • ????????if?cls?not?in?instances:??
  • ????????????instances[cls]?=?cls(*args,?**kw)??
  • ????????return?instances[cls]??
  • ????return?_singleton??
  • ?
  • @singleton??
  • class?MyClass4(object):??
  • ????a?=?1??
  • ????def?__init__(self,?x=0):??
  • ????????self.x?=?x??
  • ??
  • one?=?MyClass4()??
  • two?=?MyClass4()??
  • ??
  • two.a?=?3??
  • print?one.a??
  • #3??
  • print?id(one)??
  • #29660784??
  • print?id(two)??
  • #29660784??
  • print?one?==?two??
  • #True??
  • print?one?is?two??
  • #True??
  • one.x?=?1??
  • print?one.x??
  • #1??
  • print?two.x??
  • #1??
  • 總結(jié)

    以上是生活随笔為你收集整理的Python单例模式的4种实现方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。