当前位置: 首页 > 面试题库 >

子类别dict:UserDict,dict或ABC?

能帅
2023-03-14
问题内容

和之间的区别是什么UserDict,推荐使用哪一个?该文档似乎不赞成使用?dict``ABC``UserDict

而且似乎UserDictupdate()会使用我的setitem方法,而dict不是吗?给定我想要的自定义setitemgetitem功能,哪些方法真正对重写至关重要?

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

我想做一个dict做两件事:

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

所以其中UserDictdictABC最好将允许我这样做吗?


问题答案:

如果您想要一个实际上包含数据的自定义集合,请子类 dict 。如果您想 扩展 接口(例如,添加方法),这将特别有用。

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

ABC没有提供存储实际数据的方法,只是提供了一些方法的默认实现的接口。但是,这些默认实现将调用您的custom__getitem____setitem__。你将不得不使用内部dict来保存数据,并实现所有抽象方法:__len____iter____getitem____setitem__,和__delitem__

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

综上所述:

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


 类似资料:
  • 问题内容: 这是一个双重问题,其中包括理论部分和实际问题: 当将dict归类时: 应该被称为“安全”措施(例如,万一有一些重要的实施细节很重要)?有一个风险,即与Python的未来版本的代码休息,如果是 不 叫?我在这里寻找做一件事情或另一件事情的根本原因(实际上,打电话是安全的)。 我的猜测是,当被调用时,self已经是一个新的空dict对象,因此不需要调用(我确实希望dict首先是空的)。这个

  • 我目前有一个代码片段,其中对于每个类别,它将找到子类别: 将递归获取一个类别的子级: 目前,使用,只检索子类别的子类别,因此如果每个子类别都有自己的子类别,则不会将其保存到子类别中。 我如何显示子子类别给我们的子类别? 我想用我的代码做的是获取一个父级,获取它的子级,然后将这些子级中的每一个视为父级,递归地获取它的子级,但是我的JSON输出并没有反映这一点。只有父对象有子对象-子对象没有子对象(尽

  • 我已经为产品创建了一些自定义类别,它有子类别,子类别还有更多的子类别。现在我首先显示主要类别。如果我在那里显示子类别,那么将显示与该类别及其子类别相关的所有子类别。我想一步一步地向他们展示。也就是说,如果用户单击主类别,则会转到其子类别页面。如果用户单击其子类别之一,则应转到子类别,如果没有子类别,则显示产品。这是什么代码 它覆盖了以前的排序顺序。也就是说,如果从仪表板中,我们按排序顺序给出2到3

  • 我正在使用SQLServer 2008,我迫切需要sql查询或存储过程来显示任何类别或子类别中的顶级品牌。例如,如果我通过Id分类=2,结果集应该通过执行id分类=2及其子类别和子类别的产品计数来显示电子产品中的顶级品牌。如果我通过Id分类=38,结果应该显示手机中的顶级品牌 以下是我数据库中的表格。 类别 品牌 下表打破了类别和品牌表之间的多对多关系 分类目录品牌 产品 关于乘积表的假设 产品只

  • 我正试图通过WoodPress主题中的一个函数从woocommerce获取产品类别,我已经做到了: 这将按层次列出所有顶级类别及其下的子类别,但我有子类别(子类别)的子类别,因此如何列出这些子类别。

  • 有一个类别,具有以下(重要)属性: 我正在尝试实现类别/子类别的概念。一个类别可以有零个或多个子类别。一个类别只能有一个父类别(可以为null)。对于顶级类别,parentCategory=null。 现在,我有一个所有类别的列表,