單例模式是一種常見的軟體設計模式,其鮮明特點是打破了多次例項化會產生多個物件例項的流程,即利用各種方法使得某乙個類只有乙個例項存在。
單例模式的實現可以有多種方法:
在python裡,模組是預設的單例模式,因為當模組第一次被匯入時,會在當前的專案裡生成乙個.pyc的檔案(至於這個.pyc檔案怎麼出現的,我會在另一篇文章簡單的說一下),之後再次匯入模組的時候,如果模組沒有修改,那python就會直接呼叫.pyc檔案,而不是重新執行模組**。
這個裝飾器函式的作用是在建立類的例項之前,先判斷一下這個類是否有例項,如果有,則直接返回這個例項;若沒有,則由這個裝飾器函式建立並返回這個類的例項。
def single_obj(cls):
"""裝飾器函式:
用來實現單例模式
"""_instance = {}
def _singleton(*args, **kargs):
if cls not in _instance:
_instance[cls] = cls(*args, **kargs)
return _instance[cls]
return _singleton
@single_obj
class test(object):
"""測試類"""
def __init__(self, x=0):
self.x = x
a1 = test(1)
a2 = test(2)
print(id(a1))
print(id(a2))
# 這裡是結果
42851184
42851184
建立乙個類的例項,其實是呼叫__new__()方法,而__init__()方法其實是對這個例項進行初始化,如果我們不在類裡寫__new__()方法,則系統會呼叫我們的父類的__new__()方法,一般是object。我們知道了這一點,那就可以利用建立例項__new__()來限制例項的個數。
class test(object):
"""測試類"""
_instance = none
def __init__(self, x=0):
self.x = x
def __new__(cls, *args, **kwargs):
if not cls._instance:
"""如果沒有例項"""
cls._instance = object.__new__(cls)
return cls._instance
a1 = test(1)
a2 = test(2)
print(id(a1))
print(id(a2))
# 這裡是結果
42654576
42654576
以上的例子只是簡單的實現單例模式,在實際運用中我們不免要遇到多執行緒的情況,這就有可能出現單例模式不單例的情況,這時候我們可以通過加鎖來實現。通過以下例子我們可以看到,即使是多執行緒,例項也還是只有乙個。
import threading
import time
import random
class test(object):
"""測試類"""
_instance = none
_instance_lock = threading.lock()
def __init__(self, x=0):
self.x = x
def __new__(cls, *args, **kwargs):
if not cls._instance:
"""如果沒有例項"""
with cls._instance_lock:
if not cls._instance:
cls._instance = object.__new__(cls)
return cls._instance
def task(n):
print(f'task is start:')
o = test(n)
time.sleep(random.randint(1, 3)) # 隨機睡眠1-3秒,模擬真實任務
print(f'task is done:', id(o))
for i in range(10):
t = threading.thread(target=task, args=[i,])
t.start()
# 這裡是結果
task 0 is start:
task 1 is start:
task 2 is start:
task 3 is start:
task 4 is start:
task 5 is start:
task 6 is start:
task 7 is start:
task 8 is start:
task 9 is start:
task 5 is done: 43633408
task 2 is done: 43633408
task 8 is done: 43633408
task 7 is done: 43633408
task 1 is done: 43633408
task 6 is done: 43633408
task 9 is done: 43633408
task 4 is done: 43633408
task 0 is done: 43633408
task 3 is done: 43633408
學習python 單例設計模式
pyhton建立乙個物件的過程。單例設計模式的一種實現方式。當我們例項化乙個物件的時候,基本上可以分為如下步驟 呼叫 new cls 方法來建立乙個物件,然後找了乙個變數來接受 new 的返回值,這個返回值表示建立出來的物件的引用 呼叫 init 剛建立出來的物件的引用 方法,初始化成員變數。返回物...
python單例模式繼承 python單例模式
我們可以使用 new 這個特殊方法。該方法可以建立乙個其所在類的子類的物件。更可喜的是,我們的內建 object 基類實現了 new 方法,所以我們只需讓 sing 類繼承 object 類,就可以利用 object 的 new 方法來建立 sing 物件了。classsing object def...
單例模式 python
單例模式 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。實現 某個類只有乙個例項 途徑 1 讓乙個全域性變數使得乙個物件被訪問,但是它不能防止外部例項化多個物件。2 讓類自身負責儲存它的唯一例項。這個類可以保證沒有其他例項可以被建立。即單例模式。多執行緒時的單例模式 加鎖 雙重鎖定。餓漢式...