【发布时间】:2019-06-16 17:55:00
【问题描述】:
UserDict 有 __copy__ 和 .copy() 方法。前者由 copy.copy(x) 触发,后者由 x.copy() 触发。 在 copy() 中,它首先将 self.data 设置为 {},最后使用 c.update(self) 填写 c.data。但是, update() 将触发 __setitem__ ,可能使 c.data 与 self.data 不同
from collections import UserDict
class Foo(UserDict):
def __setitem__(self, key, value):
if isinstance(key, int):
self.data[key] = value
a = Foo({1:2})
# we force it to set key of str type
a.data['3'] = 4
# two different ways to copy
from copy import copy
b = copy(a)
c = a.copy()
# this copy(a) works fine, but a.copy() is not what we expected!!!
assert b == a
assert not c == a
为什么存在这种不一致? 为什么不只是这样:
def copy(self):
if self.__class__ is UserDict:
return UserDict(self.data.copy())
import copy
return copy.copy(self)
我不知道你可以在 Python3 中直接继承 dict。
见:How to "perfectly" override a dict?
Advantages of UserDict class in Python 。
无论如何,也许没有理由再打扰UserDict了。
参见网站Trey Hunner 提到:https://treyhunner.com/2019/04/why-you-shouldnt-inherit-from-list-and-dict-in-python/
【问题讨论】:
标签: python python-3.7