python單例模式的幾種實現方式

2022-09-17 21:12:24 字數 2232 閱讀 8781

單例模式(singleton pattern)是一種常用的軟體設計模式,該模式的主要目的是確保某乙個類只有乙個例項存在。當你希望在整個系統中,某個類只能出現乙個例項時,單例物件就能派上用場。

實現單例模式的幾種方法

1. 使用模組

其實,python的模組就是天然的單例模式,因為模組在第一次匯入的時候,會生成.pyc檔案,當第二次匯入的時候,就會直接載入.pyc檔案,而不是再次執行模組**.如果我們把相關的函式和資料定義在乙個模組中,就可以獲得乙個單例物件了.

新建乙個python模組叫singleton,然後常見以下python檔案

class singleton(object

): def foo(self):

pass

singleton = singleton()

使用:

from singleton.mysingleton import singleton

2. 使用裝飾器

裝飾器裡面的外層變數定義乙個字典,裡面存放這個類的例項.當第一次建立的收,就將這個例項儲存到這個字典中.

然後以後每次建立物件的時候,都去這個字典中判斷一下,如果已經被例項化,就直接取這個例項物件.如果不存在就儲存到字典中.

def singleton(cls):

_instance ={}

def _singleton(*args, **kwargs):

if cls not in

_instance:

_instance[cls] = cls(*args, **kwargs) # 建立乙個物件,並儲存到字典當中

return

_instance[cls]

return

_singleton

@singleton

class a(object

): a = 1

def __init__(self, x=0

): self.x =x

print(

'這是a的類的初始化方法')

a1 = a(2

)a2 = a(3

)print(id(a1), id(a2))

2501057682376

2501057682376

3.基於__new__方法實現的單例模式(推薦使用,方便)

知識點:

1> 乙個物件的例項化過程是先執行類的__new__方法,如果我們沒有寫,缺省會呼叫object的__new__方法,返回乙個例項化物件,然後再呼叫__init__方法,對這個物件進行初始化,我們可以根據這個實現單例.

2> 在乙個類的__new__方法中先判斷是不是存在例項,如果存在例項,就直接返回,如果不存在例項就建立.

import time

class

a():

instance=none

def __init__(self):

pass

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

if cls.instance is

none:

cls.instance=super().__new__(cls)

return

cls.instance

def setup(self):

print(

"cur time:

",time.time())

if __name__ == '

__main__':

a=a()

b=a()

print(id(a),id(b))

a.setup()

b.setup()

2394818100424

2394818100424

cur time:

1593963540.9315283

cur time:

1593963540.9315283

參考:

單例模式幾種實現

1.單執行緒模式下,推薦懶載入 public class singleton1 public static singleton1 getinstance return singleton 2.上述1演示,執行緒不安全,最容易想到的變為執行緒安全的方式就是加關鍵字synchronized public...

單例模式的幾種實現

首先說明 singleton 是乙個單詞,不是乙個複合詞。接下來步入正題。對於單例模式無論是 餓漢 還是 懶漢 都必須要有的是 一.私有建構函式 二.宣告靜態單例物件 如果是 懶漢 的話為了寫出好的沒有 bug的單例 還應注意 三.構造單例物件之前要加鎖 lock乙個靜態的object物件 四.需要...

單例模式的幾種實現

1 餓漢式 執行緒安全,呼叫效率高,但是不能延時載入 public class imageloader public static imageloader getinstance 一上來就把單例物件建立出來了,要用的時候直接返回即可,這種可以說是單例模式中最簡單的一種實現方式。但是問題也比較明顯。單...