蟒蛇copy
module可以重用pickle
module接口,讓類定製複製行爲。
自定義類的實例的默認值是創建一個新的空類,換出__class__
屬性,然後對於淺拷貝,只需使用原始值更新副本上的__dict__
即可。取而代之的是深度複製通過__dict__
遞歸。
否則,你指定一個__getstate__()
方法返回內部狀態。這可以是你的班級__setstate__()
可以再次接受的任何結構。
您還可以指定__copy__()
和/或__deepcopy__()
方法來控制只需複製行爲。預計這些方法會自行完成所有複製,__deepcopy__()
方法會傳遞一個備忘錄映射以傳遞給deepcopy()
遞歸調用。
一個例子可以是:
from copy import deepcopy
class Foo(object):
def __init__(self, bar):
self.bar = bar
self.spam = expression + that * generates - ham # calculated
def __copy__(self):
# self.spam is to be ignored, it is calculated anew for the copy
# create a new copy of ourselves *reusing* self.bar
return type(self)(self.bar)
def __deepcopy__(self, memo):
# self.spam is to be ignored, it is calculated anew for the copy
# create a new copy of ourselves with a deep copy of self.bar
# pass on the memo mapping to recursive calls to copy.deepcopy
return type(self)(deepcopy(self.bar, memo))
這個例子定義自定義複印掛鉤,防止self.spam
被複制過,作爲一個新的實例將重新計算。
你是什麼意思,圖書館不適用於你自己設計的類? 'copy.copy'和'copy.deepcopy'有什麼問題? –