單例,顧名思義單個實例。html
Python的面向對象由兩個很是重要的兩個「東西」組成:類、實例python
面向對象場景一:web
蒼井井,女,18,初始戰鬥力1000sql
東尼木木,男,20,初始戰鬥力1800數據庫
波多多,女,19,初始戰鬥力2500設計模式
##################### 定義類 #####################
class Person:併發
def __init__(self, na, gen, age, fig): self.name = na self.gender = gen self.age = age self.fight =fig def grassland(self): """註釋:草叢戰鬥,消耗200戰鬥力""" self.fight = self.fight - 200
##################### 建立實例 #####################fetch
cang = Person('蒼井井', '女', 18, 1000) # 建立蒼井井角色
dong = Person('東尼木木', '男', 20, 1800) # 建立東尼木木角色
bo = Person('波多多', '女', 19, 2500) # 建立波多多角色url
面向對象場景二:設計
如:建立對數據庫操做的公共類
查
#### 定義類 ####
class DbHelper(object):
def __init__(self): self.hostname = '1.1.1.1' self.port = 3306 self.password = 'pwd' self.username = 'root' def fetch(self): # 鏈接數據庫 # 拼接sql語句 # 操做 pass def create(self): # 鏈接數據庫 # 拼接sql語句 # 操做 pass def remove(self): # 鏈接數據庫 # 拼接sql語句 # 操做 pass def modify(self): # 鏈接數據庫 # 拼接sql語句 # 操做 pass
#### 操做類 ####
db = DbHelper()
db.create()
實例:結合場景二實現web應用程序
#!/usr/bin/env python #coding:utf-8 from wsgiref.simple_server import make_server class DbHelper(object): def __init__(self): self.hostname = '1.1.1.1' self.port = 3306 self.password = 'pwd' self.username = 'root' def fetch(self): # 鏈接數據庫 # 拼接sql語句 # 操做 return 'fetch' def create(self): # 鏈接數據庫 # 拼接sql語句 # 操做 return 'create' def remove(self): # 鏈接數據庫 # 拼接sql語句 # 操做 return 'remove' def modify(self): # 鏈接數據庫 # 拼接sql語句 # 操做 return 'modify' class Handler(object): def index(self): # 建立對象 db = DbHelper() db.fetch() return 'index' def news(self): return 'news' def RunServer(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) url = environ['PATH_INFO'] temp = url.split('/')[1] obj = Handler() is_exist = hasattr(obj, temp) if is_exist: func = getattr(obj, temp) ret = func() return ret else: return '404 not found' if __name__ == '__main__': httpd = make_server('', 8001, RunServer) print "Serving HTTP on port 8001..." httpd.serve_forever()
對於上述實例,每一個請求到來,都須要在內存裏建立一個實例,再經過該實例執行指定的方法。
那麼問題來了...若是併發量大的話,內存裏就會存在很是多功能上如出一轍的對象。存在這些對象確定會消耗內存,對於這些功能相同的對象能夠在內存中僅建立一個,須要時都去調用,也是極好的!!!
經過面向對象的特性,構造出單例模式:
########### 單例類定義 ########### class Foo(object): __instance = None @staticmethod def singleton(): if Foo.__instance: return Foo.__instance else: Foo.__instance = Foo() return Foo.__instance ########### 獲取實例 ########### obj = Foo.singleton()
對於Python單例模式,建立對象時不能再直接使用:obj = Foo(),而應該調用特殊的方法:obj = Foo.singleton() 。
#!/usr/bin/env python #coding:utf-8 from wsgiref.simple_server import make_server ########### 單例類定義 ########### class DbHelper(object): __instance = None def __init__(self): self.hostname = '1.1.1.1' self.port = 3306 self.password = 'pwd' self.username = 'root' @staticmethod def singleton(): if DbHelper.__instance: return DbHelper.__instance else: DbHelper.__instance = DbHelper() return DbHelper.__instance def fetch(self): # 鏈接數據庫 # 拼接sql語句 # 操做 pass def create(self): # 鏈接數據庫 # 拼接sql語句 # 操做 pass def remove(self): # 鏈接數據庫 # 拼接sql語句 # 操做 pass def modify(self): # 鏈接數據庫 # 拼接sql語句 # 操做 pass class Handler(object): def index(self): obj = DbHelper.singleton() print id(single) obj.create() return 'index' def news(self): return 'news' def RunServer(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) url = environ['PATH_INFO'] temp = url.split('/')[1] obj = Handler() is_exist = hasattr(obj, temp) if is_exist: func = getattr(obj, temp) ret = func() return ret else: return '404 not found' if __name__ == '__main__': httpd = make_server('', 8001, RunServer) print "Serving HTTP on port 8001..." httpd.serve_forever()