如(Fast way to copy dictionary in Python)所述,dict.copy()
比copy.copy()
快得多。我有一个类是dict的后代,带有一些额外的元数据:
class DictWithTimestamp(dict):
def __init__(self, timestamp):
self.timestamp = timestamp
如果我只做DictWithTimestamp(1234).copy()
,那么我会得到一个没有时间戳的字典。有没有办法保持dict.copy()
的速度并保留我的元数据?
答案 0 :(得分:0)
起初我考虑过__copy__
覆盖,但这样你就不会使用内置的dict复制方法了。所以,跳转到更新!
您可以为__copy__
类定义DictWithTimestamp
方法,您可以在其中复制其他类数据。来自docs:
为了让一个类定义自己的副本实现,它可以 定义特殊方法
__copy__()
和__deepcopy__()
。前者是 调用实现浅拷贝操作;没有额外的 参数传递。调用后者来实现深层复制 操作;它传递了一个参数,即备忘录字典。如果__deepcopy__()
实现需要制作组件的深层副本,它应该使用组件调用deepcopy()函数 作为第一个参数,备忘录字典作为第二个参数。
更新:您可以使用collections.MutableMapping
子类(请在此处详细了解:How to "perfectly" override a dict?):
class DictWithTimestamp(collections.MutableMapping):
def __init__(self, timestamp=None):
self.store = dict()
self.timestamp = timestamp
def __getitem__(self, key):
return self.store[key]
def __setitem__(self, key, value):
self.store[key] = value
def __delitem__(self, key):
del self.store[key]
def __iter__(self):
return iter(self.store)
def __len__(self):
return len(self.store)
def setstore(self, store):
self.store = store
def copy(self):
copy = self.__class__(self.timestamp)
copy.setstore(self.store.copy())
return copy
测试:
>>> d = DictWithTimestamp(1234)
>>> d['i'] = 1
>>> d.timestamp
1234
>>> d1 = d.copy()
>>> d1.items()
[('i', 1)]
>>> d1.timestamp
1234