單例模式是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例類的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在乙個,單例模式是最好的解決方案。
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__()
之前被呼叫,用於生成例項物件。利用這個方法和類的屬性的特點可以實現設計模式的單例模式。單例模式是指建立唯一物件,單例模式設計的類只能例項 這個絕對常考
1class
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)可以動態地修改乙個類或函式的功能。這裡,我們也可以使用裝飾器來裝飾某個類,使其只能生成乙個例項
1from 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)可以控制類的建立過程,它主要做三件事:
1class
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...