![](/img/trans.png)
[英]Python, etree: how to copy instance into new instance of a inherited class?
[英]Python: how to implement copy for base class which works for inherited with new attributes
如何为适用于具有新属性的继承的基类实现复制,而__copy__
为继承的类实现__copy__
( __copy__
针对新属性的哑复制)?
也就是说,我们有一个类,其中包含一个用户定义的字段和一个计算(或不应复制的外部引用)字段。 因此,复制应仅基于用户定义的字段创建实例:
class A(object):
def __init__(self, a):
self.a = a
self.b = a+1
def __copy__(self):
return A(self.a)
目前, copy
效果良好。
然后我们介绍继承的类,它的构造函数根据其自身的args为基本构造函数计算args,并引入新字段,因此继承的构造函数的签名对于基本类是完全不同且未知的(共同的):
class B(A):
def __init__(self, c):
A.__init__(self, c+100)
self.c=c
此时, copy
显然无法正常工作,并返回A
实例。 当然,我们可以为继承的类实现自己的__copy__
,但是当我们引入一些应以普通方式复制的属性时,这非常不便。 因此,我想实现的是通过A.__copy__
复制继承的类B的“一部分”,但A.__copy__
标准副本保留,而__copy__
为所有继承的类重新实现__copy__
。 那么对于这种情况是否有任何“设计模式”?
UPD:我想将示例从copy
为deepcopy
,这与实际情况更为接近。 因此,想法是相同的-我们必须管理类A的深度复制,其中包含不应深度复制的引用(即,指向包含对象的容器的链接)。 但是我们不想管理继承类的深度复制。
from copy import deepcopy
class A:
def __init__(self, content, container):
self.content = content
self.container = container
def __deepcopy__(self, memo):
return A(deepcopy(self.content, memo), self.container)
class B(A):
def __init__(self, attr):
A.__init__(self, [1,2,3], self)
self.attr = attr
b = B(123)
b1=deepcopy(b) # wrong!
看起来我找到了适合我的特定情况的模式(thx @mhawke):首先复制所有内容,然后仅深度复制必要的字段。
class A:
def __deepcopy__(self, memo):
o = copy(self)
o.content = deepcopy(self.content)
return o
但这在一般情况下不能解决问题:对于Deepcopy,我想对继承的属性进行Deepcopy,而不是对其进行复制,并且仅在必要时才对替代进行deepcoping管理。
对于您的示例,这将起作用-您“仅”必须覆盖_copyattrs
现在,我不确定这是否比覆盖__copy__
更好。
class A(object):
_copyattrs = ["a"]
def __copy__(self):
args = [getattr(self, attrname) for attrname in self._copyattrs]
return type(self)(*args)
class B(A):
_copyattrs = ["c"]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.