UserDict
,dict
和ABC
之间有什么区别?推荐哪一个?文档似乎已弃用UserDict
?
似乎UserDict的update()
会使用我的setitem
方法,而dict
则不会?在我想要自定义setitem
和getitem
功能的情况下,哪些方法对于覆盖真的很重要?
使用ABC
s我必须绝对实现所有方法,因为它没有提供默认实现吗?
我想制作一个dict
做两件事:
intern()
所有键和值那么UserDict
,dict
和ABC
哪个最能让我这样做?
答案 0 :(得分:45)
如果您想要一个实际保存数据的自定义集合,则子类 dict 。如果您想扩展接口(例如,添加方法),这将非常有用。
但是,没有任何内置方法会调用您的自定义__getitem__
/ __setitem__
。如果您需要完全控制这些,请创建一个实现collections.MutableMapping
抽象基类的自定义类。
ABC不提供存储实际数据的方法,只提供具有某些方法的默认实现的接口。但是,这些默认实现会调用您的自定义__getitem__
和__setitem__
。您必须使用内部dict
来保存数据,并实现所有抽象方法:__len__
,__iter__
,__getitem__
,__setitem__
和{{ 1}}。
来自__delitem__
模块的类UserDict
(在Python 2中,模块也称为collections
)是内部UserDict
的包装器,实现{ {1}} ABC。如果要自定义dict
的行为,则此实现可能是一个起点。
总结:
MutableMapping
的内容。如果以及如何存储数据,完全取决于您。dict
作为存储的dict
的实现。如果你想要一个类似dict的存储集合但是覆盖MutableMapping
公开的一些方法,这对你来说可能是一个很好的起点。但请务必阅读代码以了解基本方法的实现方式,以便在覆盖方法时保持一致。答案 1 :(得分:1)
不要使用UserDict
类 - 您不需要它。正如文档所说,您可以直接将dict
子类化。
但是,对于DictMixin
:
UserDict
模块
注意: DictMixin
虽然尚未正式弃用,但已在Python 3中删除,并且建议您使用collections.MutableMapping
的文档。但是,这有一个缺点 - 您需要实现更多的字典界面 - __delitem__
,__getitem__
,__iter__
,__len__
和__setitem__
。使用DictMixin
,您可以实现您想要更改的那些,其余的使用默认实现。
from UserDict import DictMixin
class MyDict(DictMixin, dict):
def __setitem__(self, key, value):
print key, value # just an example
# use intern(key) or whatever here
dict.__setitem__(self, key, value) # or
# super(MyDict, self).__setitem__(key, value)
m = MyDict()
m['a'] = 'b'
# a b
m.update({'a': 'c'})
# a c
它会自动使update
根据您的需要使用您的__setitem__
。
答案 2 :(得分:1)
我从这里找到了dict
和userdict
之间的区别的一个示例:https://dev.to/0xbf/customize-your-own-dictionary-python-tips-5b47
如果您从__delitem__
覆盖dict
,则此方法仅适用于del
方法,而不适用于pop
。
发生这种情况的原因是因为Python的内置dict有一些内联优化,导致弹出窗口不调用 delitem 。
这不是很直观。
但是,当您覆盖userdict
的{{1}}时,__delitem__
和del
都会受到影响。