在Python中复制对象的所有部分,但不包括其中一部分
在Python中,如何对一个对象进行copy.deepcopy()
,但不包括其中的某一部分呢?
我有一个对象,它基本上是一个包装器,里面有一些设置和额外的元数据,围绕着一个可能非常大的pandas数据框(DataFrame)。这个数据框可以包含任意多的数据。我想要复制这个对象,但希望它包含一个数据框的浅拷贝和设置及元数据的深拷贝(这两个部分都可能是可变的对象)。
我在运行时并不知道在需要复制的时候,所有的设置和元数据是否都存在。另外,还有可能有人会通过my_object.extra_setting
来设置对象的额外部分。这意味着我不能简单地对对象的所有部分进行深拷贝,只排除那个大的数据框。
这个类是:
class my_class(object):
def __init__(self, lots_of_data, small_amount_of_data, setting_1, setting_2, setting_3):
self.lots_of_data = lots_of_data
self.small_amount_of_data = small_amount_of_data
self.setting_1 = setting_1
self.setting_2 = setting_2
def set_setting_3(self, setting_3):
self.setting_3 = setting_3
def set_more_metadata(metadata):
self.more_metadata = metadata
而在伪代码中,复制的方法是:
def __deepcopy__(self):
copy_of_object = copy.deepcopy(self[all but object_in.lots_of_data])
copy_of_object.lots_of_data = self.lots_of_data
return copy_of_object
2 个回答
0
我怀疑你可能已经不再寻找答案了,但我在找答案的时候找到了这个解决方案,分享给大家。
import copy
def special_copy_function(object_to_be_copied: my_class) -> my_class:
memo = {id(object_to_be_copied.lots_of_data): copy.copy(object_to_be_copied.lots_of_data) # Shallow copy of large data file
output = copy.deepcopy(object_to_be_copied, memo) # Deep copy of everything else
return output
memo
是一个字典,用来传递给 deepcopy
,帮助它记住已经复制过的内容,这样就可以避免重复复制同一个项目(如果这个项目在多个地方被引用的话)。
通过把 lots_of_data
的一个浅拷贝放进 memo
字典里,deepcopy
就会使用这个值,而不是再去尝试深拷贝 lots_of_data
本身。
3
你的类需要实现 __deepcopy__()
这个方法,它的作用是选择哪些字段需要被复制。