UserDict,dict和ABC有什么区别,推荐哪一个?这些文档似乎反对UserDict。
而且,看起来UserDict的update()会使用我的setitem方法,而dict不会吗?考虑到我想要定制的setitem和getitem函数,哪些方法才是重写的关键?
对于ABC,我必须实现所有的方法,因为它没有提供默认的实现?
我想做一个做两件事的dict:
intern()所有键和值那么,UserDict、dict和ABC中哪一个最允许我这样做呢?
发布于 2011-08-22 13:58:51
如果您想要一个实际保存数据的自定义集合,则子类dict。如果要扩展接口(例如,添加方法),这尤其有用。
但是,所有内置方法都不会调用自定义的__getitem__ / __setitem__。如果需要对这些类进行完全控制,则创建一个实现collections.MutableMapping抽象基类的自定义类。
ABC不提供存储实际数据的方法,只为某些方法提供默认实现的接口。然而,这些默认实现将调用您的自定义__getitem__和__setitem__。您必须使用内部dict来保存数据,并实现所有抽象方法:__len__、__iter__、__getitem__、__setitem__和__delitem__。
来自UserDict模块的类collections (在Python2中,该模块也称为UserDict )是一个内部dict的包装器,实现MutableMapping ABC。如果您想要自定义dict的行为,这个实现可能是一个起点。
总结如下:
dict的东西。这完全取决于你是否和如何存储数据。dict作为存储的MutableMapping的实现。如果您想要一个类似块的存储集合,但是要覆盖dict公开的一些方法,那么这可能是一个很好的起点。但是,请确保阅读代码以了解基本方法是如何实现的,以便在重写方法时保持一致。发布于 2020-10-20 17:46:05
我在这里找到了一个dict和userdict之间区别的例子:https://dev.to/0xbf/customize-your-own-dictionary-python-tips-5b47
如果从__delitem__重写dict,则这将只应用于del方法,而不应用于pop。
之所以会发生这种情况,是因为Python的内置dict有一些内联优化,这导致pop没有调用delitem。
这是很不直观的。
然而,当您覆盖userdict的__delitem__时,del和pop都会受到影响。
发布于 2022-04-21 11:24:25
当您需要定制dict时,UserDict通常是最简单的选择。
正确地覆盖dict是很棘手的,而UserDict则使它变得简单。有一些关于从Python3中删除它的讨论,但我相信它是出于这个原因而保留的。示例:
class MyDict(dict):
def __setitem__(self, key, value):
super().__setitem__(key, value * 10)
d = MyDict(a=1, b=2) # Oups MyDict.__setitem__ not called
d.update(c=3) # Oups MyDict.__setitem__ not called
d['d'] = 4 # Good!
print(d) # {'a': 1, 'b': 2, 'c': 3, 'd': 40}UserDict继承了collections.abc.MutableMapping,因此没有这些缺点:
class MyDict(collections.UserDict):
def __setitem__(self, key, value):
super().__setitem__(key, value * 10)
d = MyDict(a=1, b=2) # Good: MyDict.__setitem__ correctly called
d.update(c=3) # Good: MyDict.__setitem__ correctly called
d['d'] = 4 # Good
print(d) # {'a': 10, 'b': 20, 'c': 30, 'd': 40}直接子类collections.abc.MutableMapping除了需要覆盖__len__,__iter__,而子类UserDict则容易得多。
不过,有一点要注意的是,UserDict是MutableMapping,而不是dict
assert not isinstance(collections.UserDict(), dict)
assert isinstance(collections.UserDict(), collections.abc.MutableMapping)https://stackoverflow.com/questions/7148419
复制相似问题