Python: Prototype Pattern
DuPrototype.py
import copy
## 原型模式 Prototype Pattern DuPrototype。py
class SelfReferencingEntity:
def __init__(self):
self.parent = None
def set_parent(self, parent):
self.parent = parent
class SomeComponent:
"""
Python provides its own interface of Prototype via `copy.copy` and
`copy.deepcopy` functions. And any class that wants to implement custom
implementations have to override `__copy__` and `__deepcopy__` member
functions.
"""
def __init__(self, some_int, some_list_of_objects, some_circular_ref):
self.some_int = some_int
self.some_list_of_objects = some_list_of_objects
self.some_circular_ref = some_circular_ref
def __copy__(self):
"""
Create a shallow copy. This method will be called whenever someone calls
`copy.copy` with this object and the returned value is returned as the
new shallow copy.
"""
# First, let's create copies of the nested objects.
some_list_of_objects = copy.copy(self.some_list_of_objects)
some_circular_ref = copy.copy(self.some_circular_ref)
# Then, let's clone the object itself, using the prepared clones of the
# nested objects.
new = self.__class__(
self.some_int, some_list_of_objects, some_circular_ref
)
new.__dict__.update(self.__dict__)
return new
def __deepcopy__(self, memo=None):
"""
Create a deep copy. This method will be called whenever someone calls
`copy.deepcopy` with this object and the returned value is returned as
the new deep copy.
What is the use of the argument `memo`? Memo is the dictionary that is
used by the `deepcopy` library to prevent infinite recursive copies in
instances of circular references. Pass it to all the `deepcopy` calls
you make in the `__deepcopy__` implementation to prevent infinite
recursions.
"""
if memo is None:
memo = {}
# First, let's create copies of the nested objects.
some_list_of_objects = copy.deepcopy(self.some_list_of_objects, memo)
some_circular_ref = copy.deepcopy(self.some_circular_ref, memo)
# Then, let's clone the object itself, using the prepared clones of the
# nested objects.
new = self.__class__(
self.some_int, some_list_of_objects, some_circular_ref
)
new.__dict__ = copy.deepcopy(self.__dict__, memo)
return new
main.py
调用:
## 原型模式 Prototype Pattern
list_of_objects = [1, {1, 2, 3}, [1, 2, 3]]
circular_ref = DuPrototype.SelfReferencingEntity()
component = DuPrototype.SomeComponent(23, list_of_objects, circular_ref)
circular_ref.set_parent(component)
shallow_copied_component = copy.copy(component)
# Let's change the list in shallow_copied_component and see if it changes in
# component.
shallow_copied_component.some_list_of_objects.append("另一个对象")
if component.some_list_of_objects[-1] == "另一个对象":
print(
"向shallow_copied_component添加元素 "
"some_list_of_objects 添加到组件中"
"some_list_of_objects."
)
else:
print(
"向shallow_copied_component添加元素 "
"some_list_of_objects 不会将它添加到组件中"
"some_list_of_objects."
)
# Let's change the set in the list of objects.
component.some_list_of_objects[1].add(4)
if 4 in shallow_copied_component.some_list_of_objects[1]:
print(
"更改组件的 some_list_of_objects中的对象 "
"在“shallow_copied_component”中更改该对象 "
"some_list_of_objects."
)
else:
print(
"更改组件的 some_list_of_objects中的对象 "
"不会改变“shallow_copied_component”中的对象 "
"some_list_of_objects."
)
deep_copied_component = copy.deepcopy(component)
# Let's change the list in deep_copied_component and see if it changes in
# component.
deep_copied_component.some_list_of_objects.append("一个对象")
if component.some_list_of_objects[-1] == "一个对象":
print(
"向`deep_copied_component` 中添加元素 "
"some_list_of_objects将它添加到组件中"
"some_list_of_objects."
)
else:
print(
"向`deep_copied_component`中添加元素 "
"some_list_of_objects添加不到组件中"
"some_list_of_objects."
)
# Let's change the set in the list of objects.
component.some_list_of_objects[1].add(10)
if 10 in deep_copied_component.some_list_of_objects[1]:
print(
"挂起组件的some_list_of_objects中的对象 "
"在“deep_copied_component”中更改该对象 "
"some_list_of_objects."
)
else:
print(
"挂起组件的some_list_of_objects中的对象 "
"在“deep_copied_component”中更改不了该对象"
"some_list_of_objects."
)
print(
f"id(deep_copied_component.some_circular_ref.parent): "
f"{id(deep_copied_component.some_circular_ref.parent)}"
)
print(
f"id(deep_copied_component.some_circular_ref.parent.some_circular_ref.parent): "
f"{id(deep_copied_component.some_circular_ref.parent.some_circular_ref.parent)}"
)
print(
"^^ 这表明深度复制对象包含相同的引用,它们 "
"不重复克隆。"
)
输出:
向shallow_copied_component添加元素 some_list_of_objects 添加到组件中some_list_of_objects. 更改组件的 some_list_of_objects中的对象 在“shallow_copied_component”中更改该对象 some_list_of_objects. 向`deep_copied_component`中添加元素 some_list_of_objects添加不到组件中some_list_of_objects. 挂起组件的some_list_of_objects中的对象 在“deep_copied_component”中更改不了该对象some_list_of_objects. id(deep_copied_component.some_circular_ref.parent): 2246621676496 id(deep_copied_component.some_circular_ref.parent.some_circular_ref.parent): 2246621676496 ^^ 这表明深度复制对象包含相同的引用,它们 不重复克隆。 Process finished with exit code 0
哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)生存.---Geovin Du(涂聚文)
浙公网安备 33010602011771号