Copy.deepcopy与在魔术方法中创建新实例

时间:2018-10-25 03:43:02

标签: python magic-methods

当重写python add mul 等魔术方法时,创建类的新实例然后返回该实例似乎是正常的。例如:

class test_class_simple:
    def __init__(self, x):
        self.x = x

    def __add__(self, other):
        return test_class(self.x + other.x)

但是,另一种选择是让 add 方法复制现有实例,然后仅更改其值:

import copy
def __add__(self, other):
    new = copy.deepcopy(self)
    new.x = self.x + other.x
    return new

当处理具有大量变量的复杂类时,对它们进行深度复制(如示例2所示)然后更改magic方法影响的特定属性似乎更容易,也可能更安全。但是,我没有看到很多这样做的人的例子,所以我想知道它在我不知道的那条线是否存在某些缺点。这种方法有什么危害吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我会采用您覆盖__add__的第一种方法。原因如下:

  • copy.deepcopy()是用Python而不是C编写的,因此这样做可能不会获得任何性能提升
  • 使用copy.deepcopy()不像实例化一个新对象那样清晰,因为__add__返回的对象与当前对象没有任何直接关系
  • 如果您要实例化的对象具有某种自引用循环,则copy.deepcopy()可能会卡住,因为它使用递归进行深层复制。