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

Copy.deepcopy vs creating new instances in magic methods

覆盖pythonadd,mul等魔法方法时,新建一个好像正常class 的实例,然后是 return 的实例。例如:

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

当处理具有大量变量的复杂 classes 时,深度复制它们(按照示例 2)然后更改魔术方法影响的特定属性似乎更容易也可能更安全。但是我没有看到很多人这样做的例子,所以我想知道它是否有一些我不知道的缺点。这种做法有什么坏处吗?

谢谢!

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

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