Python到現在為止也簡單額說了不少了,也不能說大多數人可以在其中學到什麼,但總有人能學到些什麼。寫這個也是希望能幫到一部分人。前面說了爬蟲,現在想起來,要學的還很多。現在一樣給朋友們送上點實用的東西,同樣希望能幫到一些朋友。
那麼,不多說,開始說今天談什麼------單列模式
開始之前還是介紹下什麼是單列模式,單例模式是一種常見的設計模式,在他的核心結構裡只包含一個被稱為單例的特殊類。這種模式可以保證系統中的一個類只有一個實例,並易於外部訪問,從而控制實例個數節約系統資源。比如,某個服務器程序的配置信息存放在一個文件中,客戶端通過一個 AppConfig 的類來讀取配置文件的信息。如果在程序運行期間,有很多地方都需要使用配置文件的內容,也就是說,很多地方都需要創建 AppConfig 對象的實例,這就導致系統中存在多個 AppConfig 的實例對象,而這樣會嚴重浪費內存資源,尤其是在配置文件內容很多的情況下。事實上,類似 AppConfig 這樣的類,我們希望在程序運行期間只存在一個實例對象。
其實在Python裡,實現單列模式的方法還是很多的,比如說使用模塊 ,使用 __new__,使用裝飾器(decorator),使用元類(metaclass),也不多講了,就只舉兩個栗子吧;
我們知道,裝飾器(decorator)可以動態地修改一個類或函數的功能。這裡,我們也可以使用裝飾器來裝飾某個類,使其只能生成一個實例,代碼如下:
from functools import wraps
def singleton(cls):
instances = {}
@wraps(cls)
def getinstance(*args, **kw):
ifcls notininstances:
instances[cls] = cls(*args, **kw)
returninstances[cls]
returngetinstance
@singleton
classMyClass(object):
a = 1
在上面,我們定義了一個裝飾器 singleton,它返回了一個內部函數 getinstance,該函數會判斷某個類是否在字典 instances 中,如果不存在,則會將 cls 作為 key,cls(*args, **kw) 作為 value 存到 instances 中,否則,直接返回 instances[cls]。
元類(metaclass)可以控制類的創建過程,它主要做三件事:
攔截類的創建
修改類的定義
返回修改後的類
用元類實現單例模式的代碼如下:
classSingleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
ifcls notincls._instances:
cls._instances[cls] = super(Singleton,cls).__call__(*args, **kwargs)
returncls._instances[cls]
# Python2
classMyClass(object):
__metaclass__ = Singleton
# Python3
# class MyClass(metaclass=Singleton):
# pass
結束了,一個人的精力有限,所以也不多說,每天有進步就可以了要知道Python 的模塊是天然的單例模式,這在大部分情況下應該是夠用的,當然了,我們也可以使用裝飾器、元類等方法。