好的......这可能是一个愚蠢的问题......但我现在没有找到答案!
我需要实现一个对象的副本,我想要复制所有属性,除了我要完全控制副本的一两个属性.
以下是对象的标准复制行为:
>>> class test(object):
... def __init__(self, arg):
... self._a = arg
...
>>> t = test(123999)
>>> t._a
123999
>>> tc = copy.copy(t)
>>> tc._a
123999
Run Code Online (Sandbox Code Playgroud)
这基本上意味着复制了所有属性.我想要做的是以下列方式重用此行为:
>>> class test(object):
... def __init__(self, arga, argb):
... self._a = arga
... self._b = argb
...
... def __copy__(self):
... obj_copy = copy.copy(self) #NOT POSSIBLE OF COURSE => infinite recursion
... obj_copy._b = my_operation(obj_copy._b)
... return obj_copy
Run Code Online (Sandbox Code Playgroud)
我希望你明白了这一点:我想重新使用对象复制行为,但挂钩我自己的操作.有没有一个干净的方法来做到这一点(没有必要for attr_name in dir(self): ...)???
你可以这样做:
def __copy__(self):
clone = copy.deepcopy(self)
clone._b = some_op(clone._b)
return clone
Run Code Online (Sandbox Code Playgroud)
这将起作用,因为deepcopy避免了递归.从python文档:
deepcopy()函数通过以下方式避免了这些问题:保留在当前复制过程中已经复制的对象的"备忘录"字典; 并让用户定义的类覆盖复制操作或复制的组件集.