python
設計模式
原型模式
import copy
class Prototype:
def __init__(self):
self.obj = {}
def Registor(self, key,new_obj):
self.obj[key] = new_obj
def UnRegistor(self, key):
del self.obj[key]
def DeepClone(self, name, **attr):
obj_clone = copy.deepcopy(self.obj.get(name))
obj_clone.__dict__.update(attr)
return obj_clone
def Clone(self, name, **attr):
obj_clone = copy.copy(self.obj.get(name))
obj_clone.__dict__.update(attr)
return obj_clone
class a:
def __init__(self):
self.name = ['a1','a2']
class b:
def __init__(self):
self.name = 'b'
a = a()
b = b()
P = Prototype()
P.Registor('a',a)
P.Registor('b',b)
aDeepClone = P.DeepClone('a')
aClone = P.Clone('a')
a.name[0] = 'new_a'
bDeepClone = P.DeepClone('a')
bClone = P.Clone('a')
b.name = 'new_b'
print('A DeepClone')
print(a.name, aDeepClone.name)
print('A Clone')
print(a.name, aClone.name)
print('----------------------')
print('B DeepClone')
print(b.name, bDeepClone.name)
print('B Clone')
print(b.name, bClone.name)
P.UnRegistor('b')
程式碼說明:
在python實作prototype需要使用copy模組來實行,在做深層複製時沒有問題,在做淺層複製時,若複製對象不是list對於結果會有錯誤的預期
prototype類別定義prototype的工作,複製、註冊物件、刪除物件。
定義需要複製的類別A、類別B,並註冊到prototype物件中
類別A為list形式
類別B為字串形式
分別進行深層複製、淺層複製。
在修蓋內容,list則修正部分,會發現到list跟一般定義的深層複製、淺層複製結果會一樣,但在一般變數的部分則不。
需要探討為什麼複製結果會這樣。
在python實作prototype需要使用copy模組來實行,在做深層複製時沒有問題,在做淺層複製時,若複製對象不是list對於結果會有錯誤的預期
prototype類別定義prototype的工作,複製、註冊物件、刪除物件。
定義需要複製的類別A、類別B,並註冊到prototype物件中
類別A為list形式
類別B為字串形式
分別進行深層複製、淺層複製。
在修蓋內容,list則修正部分,會發現到list跟一般定義的深層複製、淺層複製結果會一樣,但在一般變數的部分則不。
需要探討為什麼複製結果會這樣。
留言
張貼留言