在Python类中实现克隆方法的正确惯用方法是什么?

时间:2016-02-18 00:14:24

标签: python clone

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

使用原始类型 - 没什么难的。如何处理复杂类型?

如果复杂类型是内置的tuplesetdict - 还有copy.copy / copy.deepcopy个包,但我不确定它是多么平常的使用。

对于那些我不知道该做什么的外国班级的复杂类型。

(1) 是否有任何助手可以轻松复制?或约定,以便我可以继续他们?

当我复制对象时,我认为没有理由使用提供的构造函数,因为我已经知道所有内部契约并能够私下操纵内部状态?

(2) 如何在不使用构造函数的情况下实例化相同类型的对象?

更新我正在学习计算原理 Coursera课程并实施隐藏教学内容的课程(出于得分原因)。

他们在提供的"界面"中使用clone。我没有Python课程的经验,所以要求以适当的方式处理情况。

1 个答案:

答案 0 :(得分:3)

实施__deepcopy__(和/或__copy__)以提供对the copy module API的直接支持,或者使用copyreg注册pickle个功能;如果未定义copy.deepcopycopyreg将使用__deepcopy__注册的方法来实施深度复制。

请注意,许多Python类型(例如dictlist等)也提供了一个名为copy的方法来执行浅拷贝;通过为另一个指定一个名称,很容易支持这两个习语,例如:

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