python中建立單例模式的六種方式

2021-10-08 00:11:26 字數 3578 閱讀 4745

一、基於裝飾器實現單例模式

#裝飾器實現單例模式

defsingleton

(cls)

:def

(*args,

**kwargs):if

nothasattr

(cls,

'_instance'):

cls._instance = cls(

*args,

**kwargs)

return cls._instance

@singleton

class

singletontest

:pass

s1 = singletontest(

) s2 = singletontest(

)print

(s1)

#<__main__.singletontest object at 0x0000000000656860>

print

(s2)

#<__main__.singletontest object at 0x0000000000656860>

二、基於元類實現單例模式

'''

'''class

mytype

(type):

def__call__

(self,

*args,

**kwargs)

:"""

self指的是singletontest類

:param args:

:param kwargs:

:return:

"""ifnot

hasattr

(self,

'_instance'):

self._instance =

super

(mytype,self)

.__call__(

*args,

**kwargs)

return self._instance

class

singletontest

(metaclass=mytype)

:pass

#singletontest是元類mytype的物件,物件加括號執行元類中的__call__方法

s1 = singletontest(

)s2 = singletontest(

)print

(s1)

#<__main__.singletontest object at 0x0000000000646898>

print

(s2)

#<__main__.singletontest object at 0x0000000000646898>

三、基於__new__方法實現單例模式

class

singletontest

:def

__new__

(cls,

*args,

**kwargs)

:"""

cls::param args:

:param kwargs:

:return:

"""ifnot

hasattr

(cls,

'_instance'):

cls._instance =

super

(singletontest,cls)

.__new__(cls,

*args,

**kwargs)

return cls._instance

s1 = singletontest(

)s2 = singletontest(

)print

(s1)

#<__main__.singletontest object at 0x0000000000bd68d0>

print

(s2)

#<__main__.singletontest object at 0x0000000000bd68d0>

四、基於靜態方法實現單例模式

'''

'''class

singletontest

: @classmethod

defgetinstance

(cls):if

nothasattr

(cls,

'_instance'):

cls._instance = cls(

)return cls._instance

s1 = singletontest.getinstance(

)s2 = singletontest.getinstance(

)print

(s1)

#<__main__.singletontest object at 0x0000000000646828>

print

(s2)

#<__main__.singletontest object at 0x0000000000646828>

五、基於模組實現單例模式

class

singletontest

:pass

s = singletontest(

)#在另乙個py檔案中匯入該類物件

from base import s

print

(s)

六、monostate單例模式

將所有建立物件的__dict__屬性指向同乙個字典,這樣所有的物件實現了資料的共享。

'''

'''class

borg

: __shared_state=

def__new__

(cls,

*args,

**kwargs)

: obj =

super

(borg,cls)

.__new__(cls,

*args,

**kwargs)

obj.__dict__ = cls.__shared_state

return obj

#共享同乙個字典,乙個物件改變屬性,另乙個也跟著改變

b1 = borg(

)b1.name =

'bright'

b2 = borg(

)print

(b1.__dict__)

#print

(b2.__dict__)

#

將__shared_state變數作為乙個中間變數,並且賦值給python中儲存類所有物件狀態的__dict__變數,這在例項後,會產生兩個不同的物件,但是b1.__dict__和b2.__dict__都指向了__shared_state的記憶體位址。

注意,這種單例模式是資料的單例,物件還是兩個不一樣的物件。

python建立單例模式

在面試python工作的過程中,python的單例模式會經常被問到,而且在工作當中,也經常會使用到,所以統計了一下python實現單例模式的幾種方式。實現python單例模式,共有四種模式 1.使用 new 方法 class singleton object def new cls,args,kw ...

python中單例模式

一 單例模式設計基礎概念 單例模式 singleton pattern 是一種常用的軟體設計模式,該模式的主要目的是確保某乙個類只有乙個例項存在。當你希望在整個系統中,某個類只能出現乙個例項時,單例物件就能派上用場。目的 讓類建立物件,在系統中只有唯一的乙個實例子 每一次執行類名 返回的物件 記憶體...

python中的單例模式

單例模式 顧名思義是只有乙個例項記憶體位址,根據意思理解就是不論建立多少個例項物件,都只有乙個記憶體位址,單例模式是基於類的,是例項類物件,有別與 init init 是例項化物件.如下 domeclass single instance object instance none def init ...