Python单例模式的4种实现方法
生活随笔
收集整理的這篇文章主要介紹了
Python单例模式的4种实现方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
[python]?view plaincopy
#-*-?encoding=utf-8?-*-?? print?'----------------------方法1--------------------------'?? #方法1,實現__new__方法?? #并在將一個類的實例綁定到類變量_instance上,?? #如果cls._instance為None說明該類還沒有實例化過,實例化該類,并返回?? #如果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檢測?? print?id(one)?? #29097904?? print?id(two)?? #29097904?? print?one?==?two?? #True?? print?one?is?two?? #True?? ?? print?'----------------------方法2--------------------------'?? #方法2,共享屬性;所謂單例就是所有引用(實例、對象)擁有相同的狀態(屬性)和行為(方法)?? #同一個類的所有實例天然擁有相同的行為(方法),?? #只需要保證同一個類的所有實例具有相同的狀態(屬性)即可?? #所有實例共享屬性的最簡單最直接的方法就是__dict__屬性指向(引用)同一個字典(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是兩個不同的對象,id,?==,?is對比結果可看出?? 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具有相同的(同一個__dict__屬性),見:?? print?id(one.__dict__)?? #30104000?? print?id(two.__dict__)?? #30104000?? ?? print?'----------------------方法3--------------------------'?? #方法3:本質上是方法1的升級(或者說高級)版?? #使用__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,?**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的升級(高級)版本,?? #使用裝飾器(decorator),?? #這是一種更pythonic,更elegant的方法,?? #單例類本身根本不知道自己是單例的,因為他本身(自己的代碼)并不是單例的?? 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??
總結
以上是生活随笔為你收集整理的Python单例模式的4种实现方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kali Linux 2016.2初体验
- 下一篇: R-Tree空间索引算法的研究历程和最新