在 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...

使用基本类型 - 没什么难的。复杂类型怎么办?

如果像 tuplesetdict 这样的内置复杂类型 - 有 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 类型(例如 dictlist 等)也提供名为 copy 的方法来执行浅拷贝;通过将一个名称分配给另一个名称可以很容易地支持这两种习语,例如:

class Foo:
    def copy(self):
        ... do stuff to make a copy ...
        return newcopy
    __copy__ = copy  # Now works with copy.copy too