Python學習 單例模式

2021-09-28 13:51:49 字數 2885 閱讀 9112

單例模式是一種常見的軟體設計模式,其鮮明特點是打破了多次例項化會產生多個物件例項的流程,即利用各種方法使得某乙個類只有乙個例項存在。

單例模式的實現可以有多種方法:

在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 讓類自身負責儲存它的唯一例項。這個類可以保證沒有其他例項可以被建立。即單例模式。多執行緒時的單例模式 加鎖 雙重鎖定。餓漢式...