Python中的單例模式

2022-05-04 18:51:12 字數 2011 閱讀 1494

​單例模式是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例類的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在乙個,單例模式是最好的解決方案。

python 的模組就是天然的單例模式,因為模組在第一次匯入時,會生成.pyc檔案,當第二次匯入時,就會直接載入.pyc檔案,而不會再次執行模組**。因此,我們只需把相關的函式和資料定義在乙個模組中,就可以獲得乙個單例物件了。如果我們真的想要乙個單例類,可以考慮這樣做:

1

#a.py中的內容23

class

student(object):

4def

eat():

5pass

67 s =student()89

10#b.py中的內容

1112

from a imports13

14## a.py和b.py在同一路徑下

__new__()__init__()之前被呼叫,用於生成例項物件。利用這個方法和類的屬性的特點可以實現設計模式的單例模式。單例模式是指建立唯一物件,單例模式設計的類只能例項 這個絕對常考

1

class

singleton(object):

23 _instance =none

4def

__new__(cls, *args, **kwargs):5if

notcls._instance:

6 cls._instance = super(singleton, cls).__new__(cls, *args, **kw)

7return cls._instance

在上面的**中,我們將類的例項和乙個類變數_instance關聯起來,如果cls._instance為 none 則建立例項,否則直接返回cls._instance

裝飾器(decorator)可以動態地修改乙個類或函式的功能。這裡,我們也可以使用裝飾器來裝飾某個類,使其只能生成乙個例項

1

from functools import

wraps23

defsingleton(cls):

4 instances ={}

5@wraps(cls)

6def getinstance(*args, **kwargs):

7if cls not

ininstances:

8 instances[cls] = cls(*args, **kwargs)

9return

instances[cls]

10return

getinstance

1112

@singleton

13class

myclass(object):

14 a = 1

元類(metaclass)可以控制類的建立過程,它主要做三件事:

1

class

singleton(type):

2 _instances ={}

3def

__call__(cls, *args, **kwargs):

4if cls not

incls._instances:

5 cls._instances[cls] = super(singleton, cls).__call__(*args, **kwargs)

6return

cls._instances[cls]78

910class myclass(metaclass=singleton):

11pass

python中單例模式

一 單例模式設計基礎概念 單例模式 singleton pattern 是一種常用的軟體設計模式,該模式的主要目的是確保某乙個類只有乙個例項存在。當你希望在整個系統中,某個類只能出現乙個例項時,單例物件就能派上用場。目的 讓類建立物件,在系統中只有唯一的乙個實例子 每一次執行類名 返回的物件 記憶體...

python中的單例模式

單例模式 顧名思義是只有乙個例項記憶體位址,根據意思理解就是不論建立多少個例項物件,都只有乙個記憶體位址,單例模式是基於類的,是例項類物件,有別與 init init 是例項化物件.如下 domeclass single instance object instance none def init ...

Python 中的單例模式

單例就是解決在記憶體中始終只有乙個例項物件的問題,在python中實現起來很簡單,python中是通過new函式來分配記憶體的,舉個栗子 class musicplayer instance none def new cls,args,kwargs if cls.instance is none c...