UserDict类的优点?

新手上路,请多包涵

使用 UserDict 类有什么好处?

我的意思是,如果不是

class MyClass(object):
    def __init__(self):
        self.a = 0
        self.b = 0
...
m = MyClass()
m.a = 5
m.b = 7

我会写以下内容:

 class MyClass(UserDict):
    def __init__(self):
        UserDict.__init__(self)
        self["a"] = 0
        self["b"] = 0
...
m = MyClass()
m["a"] = 5
m["b"] = 7

编辑:如果我理解正确,在这两种情况下我都可以在运行时向对象添加新字段吗?

 m.c = "Cool"

m["c"] = "Cool"

原文由 legesh 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 669
2 个回答

UserDict.UserDict 自 Python 2.2 以来没有实质性的附加值,因为正如@gs 提到的,您现在可以子类 dict 直接 - 它的存在只是为了与 Python 2.1 及更早版本的向后兼容,当内置类型不能是子类。尽管如此,它仍保留在 Python 3 中(现在位于 collections 模块中的适当位置),因为正如 文档现在提到的 那样,

对此类的需求已部分被直接从 dict 子类化的能力所取代;但是,此类更易于使用,因为底层字典可作为属性访问。

UserDict.DictMixin ,在 Python 2 中,非常方便——正如文档所说,

该模块定义了一个 mixin,DictMixin,为已经具有最小映射接口的类定义了所有字典方法。这极大地简化了编写需要可替换字典的类(例如 shelve 模块)。

您对其进行子类化,定义一些基本方法(至少 __getitem__ ,这对于只读映射来说已经足够了,没有获取键或迭代的能力;还有 keys 如果你需要这些能力; 可能 __setitem__ ,并且你有一个没有删除项目能力的 R/W 映射;添加 __delitem__ 以获得完整的功能,并可能出于性能原因覆盖其他方法),并得到 dict 的丰富 API( updateget 等)的完整实现。 模板方法 设计模式的一个很好的例子。

在Python 3中, DictMixin 消失了;您可以通过依赖 collections.MutableMapping 来获得 几乎 相同的功能(或者只是 collections.Mapping 用于 R/O 映射)。它更优雅一点,虽然不是很方便(请参阅 这个问题,它以“不会修复”结束;简短的讨论值得一读)。

原文由 Alex Martelli 发布,翻译遵循 CC BY-SA 2.5 许可协议

对字典进行子类化可为您提供字典的所有功能,例如 if x in dict: 。如果你想扩展 dict 的特性,通常会这样做,例如创建一个有序的 dict。

顺便说一句:在最近的 Python 版本中,您可以直接子类 dict ,您不需要 UserDict

原文由 Georg Schölly 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题