2016-02-18 27 views
3

如何在Python中正確地修改clone方法?參見:在Python類中實現克隆方法的正確慣用方式?

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)如何可以實例相同類型的對象,而無需使用構造?

UPDATE我正在計算 Coursera類原則和實施教的東西(對得分的原因)隱藏類。

它們在提供的「接口」中使用clone。我沒有經驗的Python類,所以要求正確的方式來處理情況。

+0

'copy.deepcopy' – kindall

+0

@kindall官方文件說:'copy.deepcopy' *讓用戶定義的類重寫複製或該組件被複制*。該API應該由類實現? – gavenkoa

+2

「爲了讓類定義自己的拷貝實現,它可以定義特殊的方法'__copy __()'和'__deepcopy __()'。」 –

回答

3

無論哪種實施__deepcopy__(和/或__copy__)向the copy module API提供直接支持,或註冊一個pickle -ing函數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