繁体   English   中英

Python:如何为适用于具有新属性的继承的基类实现复制

[英]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:我想将示例从copydeepcopy ,这与实际情况更为接近。 因此,想法是相同的-我们必须管理类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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM