在 Python class 中实现克隆方法的正确惯用方法?
Proper idiomatic way to implement clone method in Python class?
如何在 Python 中正确地实现 clone
方法?参见:
def clone(self):
"""
Return a clone of this class
"""
clone
的原因 - 从使用的角度构建相同的 class 实例,以便可以更改副本的内部状态而不影响原始对象。
具体来说:构造函数可以初始化原始类型或复杂类型的私有字段:
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
包,但我不确定如何通常它的用法。
对于外国的复杂类型 classes 我不知道该怎么做。
(1) 有没有帮手可以轻松复制?或惯例,以便我可以转述它们?
当我复制对象时,我认为没有理由使用提供的构造函数,因为我已经知道所有内部契约并且能够私下操作内部状态?
(2) 如何在不使用构造函数的情况下实例化相同类型的对象?
更新 我正在学习 计算原理 Coursera class 并实施 class 隐藏在教学内容中的内容(出于得分原因)。
他们在提供的 "interface" 中使用 clone
。我在 Python classes 方面没有经验,所以请教如何正确处理这种情况。
实施 __deepcopy__
(and/or __copy__
) 以直接支持 the copy
module APIs, or register a pickle
-ing function with copyreg
;如果没有定义__deepcopy__
,copy.deepcopy
将使用copyreg
注册方法实现深度复制。
请注意,许多 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
如何在 Python 中正确地实现 clone
方法?参见:
def clone(self):
"""
Return a clone of this class
"""
clone
的原因 - 从使用的角度构建相同的 class 实例,以便可以更改副本的内部状态而不影响原始对象。
具体来说:构造函数可以初始化原始类型或复杂类型的私有字段:
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
包,但我不确定如何通常它的用法。
对于外国的复杂类型 classes 我不知道该怎么做。
(1) 有没有帮手可以轻松复制?或惯例,以便我可以转述它们?
当我复制对象时,我认为没有理由使用提供的构造函数,因为我已经知道所有内部契约并且能够私下操作内部状态?
(2) 如何在不使用构造函数的情况下实例化相同类型的对象?
更新 我正在学习 计算原理 Coursera class 并实施 class 隐藏在教学内容中的内容(出于得分原因)。
他们在提供的 "interface" 中使用 clone
。我在 Python classes 方面没有经验,所以请教如何正确处理这种情况。
实施 __deepcopy__
(and/or __copy__
) 以直接支持 the copy
module APIs, or register a pickle
-ing function with copyreg
;如果没有定义__deepcopy__
,copy.deepcopy
将使用copyreg
注册方法实现深度复制。
请注意,许多 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