子类dict:UserDict,dict还是ABC?

Ger*_*nuk 41 python subclass

什么之间的区别UserDict,dictABC和建议哪一种?文档似乎已经弃用了UserDict

似乎UserDict update()会使用我的setitem方法,而dict不是?在我想要自定义setitemgetitem功能的情况下,哪些方法是非常重要的?

使用ABCs我必须实现绝对所有方法,因为它没有提供默认实现?

我想做一dict件事做两件事:

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

所以其中UserDict,dictABC能最好地让我做到这一点?

Fer*_*yer 47

如果您想要一个实际保存数据的自定义集合,则为子类dict.如果要扩展接口(例如,添加方法),这尤其有用.

但是,没有内置方法可以调用您的自定义__getitem__/ __setitem__.如果需要完全控制这些,请创建一个实现collections.MutableMapping抽象基类的自定义类.

ABC不提供存储实际数据的方法,只提供具有某些方法的默认实现的接口.但是,这些默认实现将调用您的自定义__getitem____setitem__.你将不得不使用内部dict来保存数据,并实现所有抽象方法:__len__,__iter__,__getitem__,__setitem__,和__delitem__.

UserDictcollections模块(在Python 2中,模块被称为UserDict以及)是围绕内部的包装dict,实施MutableMappingABC.如果要自定义a的行为dict,则此实现可能是一个起点.

综上所述:

  • MutableMapping定义接口.对此进行子类化以创建类似于的东西dict.如果以及如何存储数据,这完全取决于您.
  • UserDictMutableMapping使用内部"真实" dict作为存储的实现.如果你想要一个类似dict的存储集合但是覆盖一些暴露的方法dict,这对你来说可能是一个很好的起点.但请务必阅读代码以了解基本方法的实现方式,以便在覆盖方法时保持一致.
  • dict是"真实的东西".如果要扩展接口,请对其进行子类化.覆盖自定义事物的方法可能很危险,因为通常有多种方法来访问数据,最终可能会出现不一致的API.

  • 建议某人将 dict 子类化,因为您认为 Python 3 中的“UserDict”已消失是错误的。就像其他人说的那样,`UserDict` 在 Python 3 中非常活跃,AFAIK 建议不要对 `dict` 本身进行子类化。 (3认同)
  • @AdrienClerc`UserDict`_module_消失了,_class_被移动到`collections`并实现了'MutableMapping` ABC.请注意``update`方法由`MutableMapping`提供,而不是'UserDict`,所以单独没有理由使用`UserDict`.如果你想要一个内部`dict`的包装器,你应该使用`UserDict`.如果你只想模拟`dict`并将数据存储在别处,可以使用`MutableMapping`. (2认同)