Python:如何实现用于继承新属性的基类的副本

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (59)

如何为基类实现副本,它适用于继承__copy__新属性,而不是为继承类实现?

即我们有一个用户定义和一个计算(或外部参考,不应复制)字段的类。因此,副本应该只根据用户定义的字段创建实例:

class A(object):
    def __init__(self, a):
        self.a = a
        self.b = a+1

    def __copy__(self):
        return A(self.a)

此时此刻copy工作正常。

然后我们引入继承的类,它的构造函数根据它自己的参数计算基础构造函数的args,并引入新的字段,因此继承构造函数的签名与基类完全不同并且是未知的(通用):

class B(A):
    def __init__(self, c):
        A.__init__(self, c+100)
        self.c=c

此时copy显然工作不好,返回A实例。因为我们可以__copy__为继承类实现自己的属性,但是当我们引入一些属性时,这些属性应该以普通的方式被复制,这是非常不方便的。所以我想实现的是将继承的类B的“A part”复制A.__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!

首先复制所有内容,然后仅复制必要的域。

class A:
    def __deepcopy__(self, memo):
        o = copy(self)
        o.content = deepcopy(self.content)
        return o

但它并不能解决常见问题:对于深度复制,我想深度复制继承的属性,而不是复制它,并只在必要时才管理覆盖。

提问于
用户回答回答于
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"]

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励