亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

Python設計模式編程中的備忘錄模式與對象池模式示例

2020-01-04 17:47:03
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Python設計模式編程中的備忘錄模式與對象池模式,文中分別舉了表單和線程的相關示例,需要的朋友可以參考下
 

Memento備忘錄模式 
備忘錄模式一個最好想象的例子:undo! 它對對象的一個狀態進行了'快照', 在你需要的時候恢復原貌。做前端會有一個場景:你設計一個表單,當點擊提交會對表單內容 驗證,這個時候你就要對用戶填寫的數據復制下來,當用戶填寫的不正確或者格式不對等問題, 就可以使用快照數據恢復用戶已經填好的,而不是讓用戶重新來一遍,不是嘛?

python的例子
這里實現了一個事務提交的例子

import copydef Memento(obj, deep=False):  # 對你要做快照的對象做快照  state = (copy.copy if deep else copy.deepcopy)(obj.__dict__)  def Restore():    obj.__dict__ = state  return Restoreclass Transaction:  deep = False  def __init__(self, *targets):    self.targets = targets    self.Commit()  # 模擬事務提交,其實就是初始化給每個對象往self.targets賦值  def Commit(self):    self.states = [Memento(target, self.deep) for target in self.targets]  # 回滾其實就是調用Memento函數,執行其中的閉包,將__dict__恢復  def Rollback(self):    for state in self.states:      state()# 裝飾器的方式給方法添加這個事務的功能def transactional(method):  # 這里的self其實就是要保存的那個對象,和類的實例無關  def wrappedMethod(self, *args, **kwargs):    state = Memento(self)    try:      return method(self, *args, **kwargs)    except:      # 和上面的回滾一樣,異常就恢復      state()      raise  return wrappedMethodclass NumObj(object):  def __init__(self, value):    self.value = value  def __repr__(self):    return '<%s: %r>' % (self.__class__.__name__, self.value)  def Increment(self):    self.value += 1  @transactional  def DoStuff(self):    # 賦值成字符串,再自增長肯定會報錯的    self.value = '1111'    self.Increment()if __name__ == '__main__':  n = NumObj(-1)  print n  t = Transaction(n)  try:    for i in range(3):      n.Increment()      print n    # 這里事務提交會保存狀態從第一次的-1到2    t.Commit()    print '-- commited'    for i in range(3):      n.Increment()      print n    n.value += 'x' # will fail    print n  except:    # 回滾只會回顧到上一次comit成功的2 而不是-1    t.Rollback()    print '-- rolled back'  print n  print '-- now doing stuff ...'  try:    n.DoStuff()  except:    print '-> doing stuff failed!'    import traceback    traceback.print_exc(0)    pass  # 第二次的異?;貪Ln還是2, 整個過程都是修改NumObj的實例對象  print n

注意
當你要保存的狀態很大,可能會浪費大量內存


對象池模式
在開發中,我們總是用到一些和'池'相關的東西,比如 內存池,連接池,對象池,線程池.. 這里說的對象池其實也就是一定數量已經創建好的對象的集合。為什么要用對象池? 創建對象是要付出代價的(我暫時還沒有研究過底層,只說我工作中體會的), 比如pymongo就自帶線程池,這樣用完就放回到池里再被重用,豈不是節省了創建的花費?

python的例子
我這里實現了個線程安全的簡單的對象池

import Queueimport typesimport threadingfrom contextlib import contextmanagerclass ObjectPool(object):  def __init__(self, fn_cls, *args, **kwargs):    super(ObjectPool, self).__init__()    self.fn_cls = fn_cls    self._myinit(*args, **kwargs)  def _myinit(self, *args, **kwargs):    self.args = args    self.maxSize = int(kwargs.get("maxSize",1))    self.queue = Queue.Queue()  def _get_obj(self):    # 因為傳進來的可能是函數,還可能是類    if type(self.fn_cls) == types.FunctionType:      return self.fn_cls(self.args)    # 判斷是經典或者新類    elif type(self.fn_cls) == types.ClassType or type(self.fn_cls) == types.TypeType:      return apply(self.fn_cls, self.args)    else:      raise "Wrong type"  def borrow_obj(self):    # 這個print 沒用,只是在你執行的時候告訴你目前的隊列數,讓你發現對象池的作用    print self.queue._qsize()    # 要是對象池大小還沒有超過設置的最大數,可以繼續放進去新對象    if self.queue.qsize()<self.maxSize and self.queue.empty():      self.queue.put(self._get_obj())    # 都會返回一個對象給相關去用    return self.queue.get()   # 回收  def recover_obj(self,obj):    self.queue.put(obj)# 測試用函數和類def echo_func(num):  return numclass echo_cls(object):  pass# 不用構造含有__enter__, __exit__的類就可以使用with,當然你可以直接把代碼放到函數去用@contextmanagerdef poolobj(pool):  obj = pool.borrow_obj()  try:    yield obj  except Exception, e:    yield None  finally:    pool.recover_obj(obj)obj = ObjectPool(echo_func, 23, maxSize=4)obj2 = ObjectPool(echo_cls, maxSize=4)class MyThread(threading.Thread):  def run(self):    # 為了實現效果,我搞了個簡單的多線程,2個with放在一個地方了,只為測試用    with poolobj(obj) as t:      print t    with poolobj(obj2) as t:      print tif __name__ == '__main__':  threads = []  for i in range(200):    t = MyThread()    t.start()    threads.append(t)  for t in threads:    t.join(True)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91夜夜揉人人捏人人添红杏| 亚洲欧美在线一区| 伊人男人综合视频网| 成人在线小视频| 国产热re99久久6国产精品| 亚洲电影天堂av| 日韩成人av在线播放| 国产精品高潮呻吟久久av黑人| 日韩精品亚洲视频| 国产欧美在线视频| 欧美国产欧美亚洲国产日韩mv天天看完整| 色中色综合影院手机版在线观看| 久久久精品在线| 136fldh精品导航福利| 久久久天堂国产精品女人| 国产v综合v亚洲欧美久久| 亚洲成人激情图| 亚洲一区二区久久久久久久| 欧美性猛交xxxx乱大交蜜桃| 亚洲福利在线看| 日韩美女av在线| 大桥未久av一区二区三区| 国产日韩欧美成人| 日韩av在线一区二区| 亚洲色图在线观看| 日韩在线观看高清| 国产欧美va欧美va香蕉在线| 久久久精品免费| 日韩在线视频导航| 亚洲成人中文字幕| 国产欧美一区二区三区在线看| 日韩网站在线观看| 亚洲天堂免费视频| 成人av资源在线播放| 日本久久亚洲电影| 日韩欧美中文第一页| 91免费视频网站| 热久久免费视频精品| 亚洲免费影视第一页| 日韩最新在线视频| 国模精品一区二区三区色天香| 日韩欧美综合在线视频| 亚洲国产精品福利| 日韩精品在线电影| 91在线高清视频| 日韩激情片免费| 久久久国产精品亚洲一区| 欧美亚洲一区在线| 亚洲免费福利视频| 日韩精品视频在线播放| 久久精品夜夜夜夜夜久久| 欧美老女人在线视频| 久久在线免费视频| 国产精品扒开腿做爽爽爽视频| 欧美福利视频网站| 青青草一区二区| 国产精品视频999| 在线日韩欧美视频| 国产一区二区三区在线看| 国产成人精品一区| 欧美激情中文字幕在线| 91免费在线视频| 亚洲成人精品视频在线观看| 午夜美女久久久久爽久久| 久久久久久久影院| 国产欧美在线观看| 亚洲一区二区三区xxx视频| 青草青草久热精品视频在线网站| 国产成人av在线| 国产精品18久久久久久麻辣| 97av在线视频| 91大神福利视频在线| 日韩电影中文字幕一区| 国产精品久久久久99| 亚洲欧洲在线播放| 欧美一区二粉嫩精品国产一线天| 亚洲国产日韩欧美在线图片| 国产成+人+综合+亚洲欧美丁香花| 91在线|亚洲| 91精品国产91久久| 欧美性xxxx极品高清hd直播| 亚洲第一页中文字幕| 伊人久久精品视频| 国产在线视频91| 97国产suv精品一区二区62| 97精品伊人久久久大香线蕉| 精品久久久久久久久久国产| 日韩中文字幕视频在线观看| 精品久久久久久| 日韩精品视频中文在线观看| 国模gogo一区二区大胆私拍| 亚洲国产婷婷香蕉久久久久久| 91久久久久久久久久久| 亚洲a中文字幕| 国产69精品99久久久久久宅男| 91欧美激情另类亚洲| 久久精品国产亚洲一区二区| 亚洲tv在线观看| 国产精品爽爽爽| 欧美最猛性xxxxx亚洲精品| 51精品国产黑色丝袜高跟鞋| 国产精品xxx视频| 欧美人与性动交a欧美精品| 一级做a爰片久久毛片美女图片| 一级做a爰片久久毛片美女图片| 成人淫片在线看| 亚洲精品一区二区久| 日韩精品视频在线观看免费| 国产精品自在线| 茄子视频成人在线| 一区二区三区四区在线观看视频| 91免费精品视频| 日韩精品免费综合视频在线播放| 欧美日本亚洲视频| 亚洲偷熟乱区亚洲香蕉av| 亚洲精品成人网| 国产精品久久久久久久久粉嫩av| 国产精品亚洲综合天堂夜夜| 久久婷婷国产麻豆91天堂| 92福利视频午夜1000合集在线观看| 成人性生交大片免费看视频直播| 国产精品视频网址| 国产男女猛烈无遮挡91| 欧美重口另类videos人妖| 97热精品视频官网| 日韩国产激情在线| 欧美大片第1页| 性欧美xxxx视频在线观看| 热99精品里视频精品| 在线午夜精品自拍| 日韩欧美精品网站| 久久久久久亚洲精品不卡| 日韩精品中文在线观看| 久久国产精品电影| 亚洲欧美中文日韩v在线观看| 国产中文日韩欧美| 亚洲人成电影网站色xx| 色无极亚洲影院| 亚洲精品美女久久| 亚洲福利视频在线| 一夜七次郎国产精品亚洲| 精品国产鲁一鲁一区二区张丽| 精品中文字幕视频| 日韩成人在线观看| 中文字幕亚洲欧美一区二区三区| 欧美男插女视频| 国产精品电影久久久久电影网| 国产小视频91| 亚洲福利影片在线| 亚洲综合小说区| 亚洲一区二区三区sesese| 亚洲色图35p| 亚洲欧洲激情在线| 亚洲午夜性刺激影院| 91精品国产九九九久久久亚洲| 国产精品精品一区二区三区午夜版| 欧美激情视频网址| 亚洲精品小视频在线观看| 成人激情视频小说免费下载| 4k岛国日韩精品**专区| 亚洲精品国产精品久久清纯直播| 久久久久久91香蕉国产| 青青草一区二区| 综合欧美国产视频二区|