gpt4 book ai didi

python - 子类 dict : UserDict, dict 还是 ABC?

转载 作者:IT老高 更新时间:2023-10-28 21:40:25 28 4
gpt4 key购买 nike

UserDictdictABC有什么区别,推荐哪一种?文档似乎已弃用 UserDict?

似乎 UserDict 的 update() 会使用我的 setitem 方法,而 dict 不会?鉴于我想要自定义 setitemgetitem 函数,哪些方法是真正需要重写的?

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

我想做一个 dict 做两件事:

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

那么 UserDictdictABC 中的哪一个最适合我这样做?

最佳答案

如果您想要一个实际保存数据的自定义集合,请继承 dict。如果您想扩展接口(interface)(例如,添加方法),这将特别有用。

不过,没有任何内置方法会调用您的自定义 __getitem__/__setitem__。如果您需要完全控制这些,请创建一个自定义类来实现 collections.MutableMapping 抽象基类。

ABC 不提供存储实际数据的方法,仅提供具有某些方法的默认实现的接口(interface)。但是,这些默认实现将调用您的自定义 __getitem____setitem__。您必须使用内部 dict 来保存数据,并实现所有抽象方法:__len____iter____getitem____setitem____delitem__

collections 模块中的 UserDict 类(在 Python 2 中,该模块也称为 UserDict)是内部dict,实现MutableMapping ABC。如果你想自定义 dict 的行为,这个实现可能是一个起点。

总结:

  • MutableMapping 定义接口(interface)。将其子类化以创建类似于 dict 的东西。是否存储数据以及如何存储数据完全取决于您。
  • UserDictMutableMapping 的实现,使用内部“真实”dict 作为存储。如果您想要一个类似 dict 的存储集合,但要覆盖 dict 公开的一些方法,这对您来说可能是一个很好的起点。但请务必阅读代码以了解基本方法是如何实现的,以便在重写方法时保持一致。
  • dict 是“真实的东西”。如果您想扩展接口(interface),则将其子类化。重写方法来执行自定义操作可能很危险,因为访问数据的方法通常有多种,最终可能会导致 API 不一致。

关于python - 子类 dict : UserDict, dict 还是 ABC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7148419/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com