子类字典:UserDict,字典或ABC?
UserDict
, dict
和ABC
之间有什么区别,推荐哪一个? 该文件似乎不赞成UserDict
?
也似乎UserDict的update()
将使用我的setitem
方法而dict
不呢? 哪些方法是真正必要的重setitem
定我想要自定义setitem
和getitem
函数?
有了ABC
我必须实现绝对所有的方法,因为它没有提供默认的实现?
我想做一个dict
,做两件事情:
-
intern()
所有的键和值 - 将一些值存储在SQLite数据库中
那么哪个UserDict
, dict
和ABC
最好让我这样做呢?
如果你想要一个实际上包含数据的自定义集合,可以使用子类字典 。 如果你想扩展接口(例如添加方法),这是特别有用的。
不过内置的方法都不会调用你自定义的__getitem__
/ __setitem__
。 如果您需要对这些控件进行完全控制,请创build一个实现了collections.MutableMapping
抽象基类的自定义类。
ABC不提供存储实际数据的手段,只有一些接口具有某些方法的默认实现。 但是,这些默认实现将调用您的自定义__getitem__
和__setitem__
。 您将不得不使用内部dict
来保存数据,并实现所有抽象方法: __iter__
__len__
__iter__
, __iter__
__len__
__iter__
, __iter__
__len__
__iter__
, __iter__
__getitem__
和__delitem__
。
collections
模块中的类UserDict
(在Python 2中,该模块也称为UserDict
)是一个内部dict
的包装,实现了MutableMapping
ABC。 如果你想自定义一个dict
的行为,这个实现可能是一个起点。
综上所述:
- MutableMapping定义了接口。 子类这个来创build一个像
dict
一样的东西。 如果你如何存储数据,这完全取决于你。 - UserDict是一个使用内部“真实”
dict
作为存储的MutableMapping
实现。 如果你想要一个类似字典的存储集合,但是重写dict
暴露的一些方法,这可能是一个很好的起点。 但是请确保阅读代码以了解如何实现基本方法,以便在重写方法时保持一致。 - 字典是“真实的”。 如果要扩展接口,请inheritance这个子类。 重写方法来执行自定义事情可能是危险的,因为通常有多种访问数据的方式,而且最终会导致不一致的API。
不要使用UserDict
类 – 你不需要它。 正如文档所说,你可以直接子类dict
。
但是,您仍然需要用于DictMixin
的UserDict
模块:
注意: DictMixin
虽然没有正式弃用,但已经在Python 3中被删除了,在文档中推荐使用collections.MutableMapping
。 然而,这有一个缺点 – 你需要实现更多的字典接口 – __delitem__
__iter__
, __iter__
__len__
__iter__
, __iter__
__len__
__iter__
, __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' # ab m.update({'a': 'c'}) # ac
它会自动update
使用你的__setitem__
只要你想。