- 內(nèi)容:保證一個(gè)類只有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)
- 角色:
- 單例(Singleton)
- UML圖
- 舉個(gè)例子:
需求:一個(gè)類只能實(shí)例化一個(gè)對(duì)象,不能實(shí)例化多個(gè)對(duì)象
from abc import abstractmethod,ABCMeta
'''
__new__:
在基礎(chǔ)類object中,__new__被定義成了一個(gè)靜態(tài)方法,并且需要傳遞一個(gè)參數(shù)cls。Cls表示需要實(shí)例化的類,此參數(shù)在實(shí)例化時(shí)由Python解析器自動(dòng)提供。
new()是在新式類中新出現(xiàn)的方法,它作用在構(gòu)造方法init()建造實(shí)例之前,可以這么理解,
在Python 中存在于類里面的構(gòu)造方法init()負(fù)責(zé)將類的實(shí)例化,而在init()調(diào)用之前,
new()決定是否要使用該init()方法,
因?yàn)閚ew()可以調(diào)用其他類的構(gòu)造方法或者直接返回別的對(duì)象來(lái)作為本類的實(shí)例。
hasattr(cls,"_instance"):
判斷這個(gè)類是否已經(jīng)實(shí)例化
'''
class Singleton:
def __new__(cls, *args, **kwargs):
# 如果沒(méi)有實(shí)例化,就實(shí)例化
if not hasattr(cls,"_instance"):
cls._instance=super(Singleton,cls).__new__(cls)
return cls._instance
class MyClass(Singleton):
def __init__(self,a):
self.a=a
a=MyClass(10)
b=MyClass(20)
print(a.a)
print(b.a)
print(id(a),id(b))
輸出結(jié)果
20
20
139718467807696 139718467807696
說(shuō)明是同一個(gè)對(duì)象文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-605642.html
- 優(yōu)點(diǎn):
- 對(duì)唯一實(shí)例的受控訪問(wèn)
- 單例相當(dāng)于全局變量,但訪問(wèn)了命名空間被污染
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-605642.html
到了這里,關(guān)于5.python設(shè)計(jì)模式【單例模式】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!