我有两个类:父类和容器类。父类实例将匹配的容器类实例作为弱引用。在
深度复制父实例时出现问题,weakref仍链接到原始实例。下面是一个最小的例子:
import weakref
from copy import deepcopy
class Container:
def __init__(self, parent):
self.parent = weakref.ref(parent)
class Parent:
def __init__(self):
self.container = Container(self)
if __name__ == '__main__':
parent1 = Parent()
assert(parent1 is parent1.container.parent())
parent2 = deepcopy(parent1)
assert(parent2 is parent2.container.parent())
第二个断言失败。在
我怀疑__deepcopy__
魔术方法是可以实现的,但不确定具体如何实现。在
问题是
deepcopy
不会跟随weakref.ref
链接。它甚至不复制weakref.ref
:它是显式硬编码的in the ^{} module 。我不知道这是为什么,但我怀疑他们有他们的理由。在
但是,您可以实现
^{pr2}$__deepcopy__
方法:由于临时的
__deepcopy__
实例属性,它有点难看。但是它允许在self
上使用普通的deepcopy
函数,而无需进行无限递归,然后您只需手动创建一个新的对父对象的弱引用。在您甚至可以不临时设置
__deepcopy__
(它应该可以正常工作):相关问题 更多 >
编程相关推荐