在聊這以前咱們首先要明確的是,單例模式在實際中的意義以及在python中具備實現的價值?html
當前,相信有不少人支持單例模式,也有很多人反對,尤爲是在python中,目前依舊具備很大的爭議性。咱們要在評論以前首先要了解單例模式python
顧名思義:就是單個模式web
單例模式是一種常見的軟件設置模式,在它的核心結構中只包含一個被稱爲單例類的特殊類,經過單例模式能夠保證系統中的一個類只有一個實例並且該實例易於外界訪問,從而方便對實例個數的控制並節約系統資源。若是但願在系統中某個對象只能存在一個,單例模式是最好的解決方案。sql
單例模式的要點有三類數據庫
可是從具體角度實現來講的話,又能夠分爲三點ide
1、實例控制函數
經過面向的特性,簡單的構造出單例模式fetch
# ########### 單例類定義 ########### class Foo(object): __instance = None @staticmethod def singleton(): if Foo.__instance: return Foo.__instance else: Foo.__instance = Foo() return Foo.__instance # ########### 獲取實例 ########### obj = Foo.singleton()
當用於WEB界面時,單例模式的簡單運用url
1 #!/usr/bin/env python 2 #coding:utf-8 3 from wsgiref.simple_server import make_server 4 5 # ########### 單例類定義 ########### 6 class DbHelper(object): 7 8 __instance = None 9 10 def __init__(self): 11 self.hostname = '1.1.1.1' 12 self.port = 3306 13 self.password = 'pwd' 14 self.username = 'root' 15 16 @staticmethod 17 def singleton(): 18 if DbHelper.__instance: 19 return DbHelper.__instance 20 else: 21 DbHelper.__instance = DbHelper() 22 return DbHelper.__instance 23 24 def fetch(self): 25 # 鏈接數據庫 26 # 拼接sql語句 27 # 操做 28 pass 29 30 def create(self): 31 # 鏈接數據庫 32 # 拼接sql語句 33 # 操做 34 pass 35 36 def remove(self): 37 # 鏈接數據庫 38 # 拼接sql語句 39 # 操做 40 pass 41 42 def modify(self): 43 # 鏈接數據庫 44 # 拼接sql語句 45 # 操做 46 pass 47 48 49 class Handler(object): 50 51 def index(self): 52 obj = DbHelper.singleton() 53 print id(single) 54 obj.create() 55 return 'index' 56 57 def news(self): 58 return 'news' 59 60 61 def RunServer(environ, start_response): 62 start_response('200 OK', [('Content-Type', 'text/html')]) 63 url = environ['PATH_INFO'] 64 temp = url.split('/')[1] 65 obj = Handler() 66 is_exist = hasattr(obj, temp) 67 if is_exist: 68 func = getattr(obj, temp) 69 ret = func() 70 return ret 71 else: 72 return '404 not found' 73 74 if __name__ == '__main__': 75 httpd = make_server('', 8001, RunServer) 76 print "Serving HTTP on port 8001..." 77 httpd.serve_forever() 78 79 Web應用實例-單例模式
不過咱們須要注意的是:spa
特殊方法__new__是一個元構造程序,每當一個對象必須被factory類實例化時,就將調用它。__new__方法必須返回一個類的實例,所以它能夠在對象建立以前或以後修改類。
由於__init__在子類中不會被隱式調用,因此__new__能夠用來肯定已經在整個類層次完成了初始化構造。__new__是對於對象狀態隱式初始化需求的迴應,使得能夠在比__init__更低的一個層次上定義一個初始化,這個初始化老是會被調用。
與__init__()相比__new__()方法更像一個真正的構造器。隨着類和類型的統一,用戶能夠對內建類型進行派生,所以須要一種途徑來實例化不可變對象,好比派生字符串,在這種狀況下解釋器則調用類的__new__()方法,一個靜態方法,而且傳入的參數是在類實例化操做時生成的。__new__()會調用父類的__new__()來建立對象(向上代理)
·__new__必須返回一個合法的實例,這樣解釋器在調用__init__()時,就能夠吧這個實例做爲self傳給他。調用父類的__new__()來建立對象,正向其餘語言使用new關鍵字同樣
單利模式存在的目的是保證當前內存中僅存在單個實例,避免內存浪費!!!