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()
可能会卡住,因为它使用递归来执行深层复制。
覆盖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()
可能会卡住,因为它使用递归来执行深层复制。