子类字典:UserDict,字典或ABC?

UserDictdictABC之间有什么区别,推荐哪一个? 该文件似乎不赞成UserDict

也似乎UserDict的update()将使用我的setitem方法而dict不呢? 哪些方法是真正必要的重setitem定我想要自定义setitemgetitem函数?

有了ABC我必须实现绝对所有的方法,因为它没有提供默认的实现?

我想做一个dict ,做两件事情:

  • intern()所有的键和值
  • 将一些值存储在SQLite数据库中

那么哪个UserDictdictABC最好让我这样做呢?

如果你想要一个实际上包含数据的自定义集合,可以使用子类字典 。 如果你想扩展接口(例如添加方法),这是特别有用的。

不过内置的方法都不会调用你自定义的__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

但是,您仍然需要用于DictMixinUserDict模块:

注意: 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__只要你想。