Python Python如何實現單例模式?

2021-06-22 05:03:39 字數 2173 閱讀 5455

對於系統中的某些類來說,只有乙個例項很重要,例如,乙個系統中可以存在多個列印任務,但是只能有乙個正在列印的任務;乙個系統中只能有乙個串列埠管理器或檔案系統;乙個系統只能有乙個計時工具或id生成器。如在window是中就只能開啟乙個任務管理器。如果不使用機制對視窗物件進行唯一化,將彈出多個視窗,如果這些視窗顯示的內容完全一致,則是重複物件,浪費記憶體資源;如果這些視窗顯示的內容不一致,則意味著在某一瞬間系統有多個狀態,與實際不符,也會給使用者帶來誤解,不知道哪個才是真實的狀態。

有時確保系統中某個物件的唯一性(即乙個類只有乙個例項)非常重要。如何保證只有乙個例項並且這個例項能被訪問到?建立乙個全域性變數可以保證物件隨時都能被訪問,但不能阻止例項化多個物件。乙個更好的方法是讓類自身負責儲存它的唯一例項,並且讓這個類保證沒有其他例項建立。

單例模式的要素:

保證乙個類只有乙個例項。所有引用(例項、物件)擁有相同的狀態(屬性)和行為(方法);

保證這個類必須自行建立這個例項;

保證這個類向整個系統提供這個例項。

因此:單例模式只提供私有的建構函式;

類中定義乙個含有該類的靜態私有物件

該類提供乙個靜態的共有的函式用於建立或獲取它本身的靜態私有物件

#共享屬性,所謂單例就是所有引用(例項,物件)擁有相同的狀態(屬性)和行為(方法)

#同乙個類的所有例項天然擁有相同的行為(方法),

#只需要保證同乙個類的所有例項具有相同的狀態(屬性)即可

#而所有例項共享屬性的最直接最簡單的方法就是__dict__屬性指向(引用)同乙個字典

class borg(object):

_state = {}

#單下劃線開頭,這個被常用於模組中,

#在乙個模組中以單下劃線開頭的變數和函式被預設當作內部函式,

#如果使用 from a_module import * 匯入時,這部分變數和函式不會被匯入。

#不過值得注意的是,如果使用 import a_module 這樣匯入模組,

#仍然可以用 a_module._some_var 這樣的形式訪問到這樣的物件。

def __new__(cls, *args, **kw):

#引數帶乙個星號,可以接受任意多的位置引數,帶兩個星號,可以接受任意多的關鍵字引數

ob = super(borg, cls).__new__(cls, *args, **kw)

#繫結超類,呼叫超類object的__new__

#__new__(...)

#t.__new__(s, ...) -> a new object with type s, a subtype of t

#在這裡返回object類的乙個新物件

ob.__dict__ = cls._state

print(type(ob))

#__dict__包含了模組裡可用的屬性名-屬性的字典;

#也就是可以使用模組名.屬性名訪問的物件

return ob

class myclass(borg):

a = 1

one = myclass()

two = myclass()

two.a = 3

print("a in one is: ", one.a)

print("identity of one is: ", id(one))

print("identity of two is: ", id(two))

print("is one equal to two? ", one == two)

print("__dict__ in one: ", one.__dict__)

print("__dict__ in two: ", two.__dict__)

輸出:

>>> ******************************== restart ******************************==

>>>

a in one is: 3

identity of one is: 38745136

identity of two is: 38242768

is one equal to two? false

__dict__ in one:

__dict__ in two:

巢狀python Python中包如何巢狀

init py檔案 init py控制著包匯入行為。init py為空,意味著僅僅把這個包匯入,不會匯入包中的模組。在 init py檔案中,定義乙個 all 變數,它控制著from包名import 是匯入的模組。可以在 init py檔案中編寫內容,當匯入時,這些語句就會被執行。init py模組...

匯入 python Python庫如何安裝和匯入

通過pip來安裝python庫 如何安裝pip?python setup.py install如何驗證pip安裝成功?pip v安裝包 pip install netmiko公升級包 pip install upgrade netmiko解除安裝包 pip uninstall netmiko搜尋包 ...

跨行業如何學習好python Python學習!

python是一門非常不錯的語言,大家應該都知道它非常簡單 易學,因此對於跨行業人員來說是非常合適的選擇,那麼跨行業如何學習好python?當我們學習python的時候,要帶著問題去學習,學了python能解決工作 生活中的實際問題,有了解決問題的動力,可以讓我們學習興趣更高。2 別隨意更風 別看到...