聊聊python里如何用Borg pattern實現(xiàn)的單例模式
有如下 borg pattern 的實現(xiàn):
class Borg(object):
__shared_state = {}
def __init__(self):
self.__dict__ = self.__shared_state
self.state = 'Init'
def __str__(self):
return self.state
之前一直看不懂為什么 Borg class 要那樣實現(xiàn), 后來學(xué)到兩個知識點后發(fā)現(xiàn)原來這么簡單明了:
- 關(guān)于 __shared_state:
- 在 __init__(self, ) 外面定義的變量,是屬于這個 class 的,并且由所有的 instance 共享的,而不是單屬于某個instance; 在 __init__(self, ) 里面定義的變量,只屬于這個 object instance (self) 本身。
- 關(guān)于 __dict__:
- 類的靜態(tài)函數(shù)、類函數(shù)、普通函數(shù)、全局變量以及一些內(nèi)置的屬性都是放在類__dict__里的;對象的__dict__中存儲了一些self.xxx的一些東西
試著跑一下:
if __name__ == '__main__':
rm1 = Borg()
rm2 = Borg()
rm1.state = 'Idle'
rm2.state = 'Running'
print('rm1: {0}'.format(rm1))
print('rm2: {0}'.format(rm2))
rm2.state = 'Zombie'
print('rm1: {0}'.format(rm1))
print('rm2: {0}'.format(rm2))
print('rm1 id: {0}'.format(id(rm1)))
print('rm2 id: {0}'.format(id(rm2)))
rm3 = YourBorg()
print('rm1: {0}'.format(rm1))
print('rm2: {0}'.format(rm2))
print('rm3: {0}'.format(rm3))
其結(jié)果為:
### OUTPUT ###
# rm1: Running
# rm2: Running
# rm1: Zombie
# rm2: Zombie
# rm1 id: 140732837899224
# rm2 id: 140732837899296
# rm1: Init
# rm2: Init
# rm3: Init
本文代碼來自: https://github.com/faif/python-patterns/blob/master/patterns/creational/borg.py
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python中使用Counter進(jìn)行字典創(chuàng)建以及key數(shù)量統(tǒng)計的方法
今天小編就為大家分享一篇Python中使用Counter進(jìn)行字典創(chuàng)建以及key數(shù)量統(tǒng)計的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07
Python編程之字符串模板(Template)用法實例分析
這篇文章主要介紹了Python編程之字符串模板(Template)用法,結(jié)合具體實例形式分析了Python字符串模板的功能、定義與使用方法,需要的朋友可以參考下2017-07-07
Python如何批量處理經(jīng)緯度數(shù)據(jù)并生成位置信息
這篇文章主要介紹了Python如何批量處理經(jīng)緯度數(shù)據(jù)并生成位置信息問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08
python基礎(chǔ)之函數(shù)的定義和調(diào)用
這篇文章主要介紹了python函數(shù)的定義和調(diào)用,實例分析了Python中返回一個返回值與多個返回值的方法,需要的朋友可以參考下2021-10-10
matplotlib實現(xiàn)數(shù)據(jù)實時刷新的示例代碼
這篇文章主要介紹了matplotlib實現(xiàn)數(shù)據(jù)實時刷新的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01

