2 回答

TA貢獻1818條經驗 獲得超8個贊
任何時候你實現一個特殊的方法(如__getattr__,__deepcopy__,__str__,等),您可能需要上浮MRO超或使用原來的某個子集。
我尚不清楚您是如何記憶屬性的,但我將簡化您的示例。假設您始終使用相同的a(并且它是不可變的,不需要復制),但是否則,您想要復制b。(你可以通過a和b直接構造,使一個新的對象。
class CustomDeepcopy(object):
def __init__(self, a=None, b=None):
if a:
self.a = a
if b:
self.b = b
a = SomeSimpleObject()
b = SomeBigObject()
@property
def dont_deepcopy(self):
return ['b']
@property
def deepcopy_attributes(self):
return ['a']
def __deepcopy__(self,memo):
new_kwargs = dict((k, getattr(self, attr, None)) for attr in self.dont_deepcopy)
for attr in self.deepcopy_attributes:
new_kwargs[attr] = copy.deepcopy(getattr(self, attr, None))
return self.__class__(**new_kwargs)

TA貢獻1803條經驗 獲得超6個贊
copy.deepcopy僅__deepcopy__在存在該方法的情況下才會調用-我們可以通過保存__deepcopy__,調用copy.deepcopy(...)的值,__deepcopy__然后在返回結果之前恢復的值來避免這種情況:
class CustomDeepcopy(object):
a = SomeSimpleObject()
b = SomeBigObject()
def dont_deepcopy(self):
return ['b']
def __deepcopy__(self,memo):
for attr in self.dont_deepcopy():
val = getattr(self,attr,None)
if val is not None:
memo[id(val)]=val
deepcopy_method = self.__deepcopy__
self.__deepcopy__ = None
result = copy.deepcopy(self,memo)
self.__deepcopy__ = deepcopy_method
return result
添加回答
舉報