四、Python 設計模式之原型模式
阿新 • • 發佈:2018-12-12
原型模式的目的是克隆物件 或者 副本
類似於淺拷貝和深拷貝
淺拷貝就是 副本依賴引用
深拷貝就是 完全克隆一份
以下是簡單的例子
import copy class A: def __init__(self): self.x = 18 self.msg = 'Hello' class B(A): def __init__(self): A.__init__(self) self.y = 34 def __str__(self): return '{}, {}, {}'.format(self.x, self.msg, self.y) if __name__ == '__main__': b = B() c = copy.deepcopy(b) print([str(i) for i in (b, c)]) print([i for i in (b, c)])
自己實現,好處是不單單 可以實現深拷貝功能,還能自定義一些 註冊 登出服務(增添和刪除功能)、
# coding: utf-8 import copy from collections import OrderedDict class Book: def __init__(self, name, authors, price, **rest): '''rest的例子有:出版商,長度,標籤,出版日期''' self.name = name self.authors = authors self.price = price # 單位為美元 self.__dict__.update(rest) def __str__(self): mylist = [] ordered = OrderedDict(sorted(self.__dict__.items())) for i in ordered.keys(): mylist.append('{}: {}'.format(i, ordered[i])) if i == 'price': mylist.append('$') mylist.append('\n') return ''.join(mylist) class Prototype: def __init__(self): self.objects = dict() def register(self, identifier, obj): self.objects[identifier] = obj def unregister(self, identifier): del self.objects[identifier] def clone(self, identifier, **attr): found = self.objects.get(identifier) if not found: raise ValueError('Incorrect object identifier: {}'.format(identifier)) obj = copy.deepcopy(found) obj.__dict__.update(attr) return obj def main(): b1 = Book('The C Programming Language', ('Brian W. Kernighan', 'Dennis M.Ritchie'), price=118, publisher='Prentice Hall', length=228, publication_date='1978-02-22', tags=('C', 'programming', 'algorithms', 'data structures')) prototype = Prototype() cid = 'k&r-first' prototype.register(cid, b1) b2 = prototype.clone(cid, name='The C Programming Language(ANSI)', price=48.99, length=274, publication_date='1988-04-01', edition=2) for i in (b1, b2): print(i) print('ID b1 : {} != ID b2 : {}'.format(id(b1), id(b2))) if __name__ == '__main__': main()