如何在Python中惯用正确的实现clone
方法?参见:
def clone(self):
"""
Return a clone of this class
"""
clone
的原因 - 从使用角度构造相同的类实例,因此可以更改内部复制状态而不影响原始对象。
具体来说:构造函数可以初始化基本类型或复杂类型的私有字段:
def __init__(self, initial = None, width = DEFAULT_SIZE, height = DEFAULT_SIZE):
self._width = width
self._height = height
self._matrix = ...complex code, list of list...
使用原始类型 - 没什么难的。如何处理复杂类型?
如果复杂类型是内置的tuple
,set
,dict
- 还有copy.copy
/ copy.deepcopy
个包,但我不确定它是多么平常的使用。
对于那些我不知道该做什么的外国班级的复杂类型。
(1) 是否有任何助手可以轻松复制?或约定,以便我可以继续他们?
当我复制对象时,我认为没有理由使用提供的构造函数,因为我已经知道所有内部契约并能够私下操纵内部状态?
(2) 如何在不使用构造函数的情况下实例化相同类型的对象?
更新我正在学习计算原理 Coursera课程并实施隐藏教学内容的课程(出于得分原因)。
他们在提供的"界面"中使用clone
。我没有Python课程的经验,所以要求以适当的方式处理情况。
答案 0 :(得分:3)
实施__deepcopy__
(和/或__copy__
)以提供对the copy
module API的直接支持,或者使用copyreg
注册pickle
个功能;如果未定义copy.deepcopy
,copyreg
将使用__deepcopy__
注册的方法来实施深度复制。
请注意,许多Python类型(例如dict
,list
等)也提供了一个名为copy
的方法来执行浅拷贝;通过为另一个指定一个名称,很容易支持这两个习语,例如:
class Foo:
def copy(self):
... do stuff to make a copy ...
return newcopy
__copy__ = copy # Now works with copy.copy too