使用 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 许可协议
UserDict.UserDict
自 Python 2.2 以来没有实质性的附加值,因为正如@gs 提到的,您现在可以子类dict
直接 - 它的存在只是为了与 Python 2.1 及更早版本的向后兼容,当内置类型不能是子类。尽管如此,它仍保留在 Python 3 中(现在位于collections
模块中的适当位置),因为正如 文档现在提到的 那样,UserDict.DictMixin
,在 Python 2 中,非常方便——正如文档所说,您对其进行子类化,定义一些基本方法(至少
__getitem__
,这对于只读映射来说已经足够了,没有获取键或迭代的能力;还有keys
如果你需要这些能力; 可能__setitem__
,并且你有一个没有删除项目能力的 R/W 映射;添加__delitem__
以获得完整的功能,并可能出于性能原因覆盖其他方法),并得到dict
的丰富 API(update
,get
等)的完整实现。 模板方法 设计模式的一个很好的例子。在Python 3中,
DictMixin
消失了;您可以通过依赖collections.MutableMapping
来获得 几乎 相同的功能(或者只是collections.Mapping
用于 R/O 映射)。它更优雅一点,虽然不是很方便(请参阅 这个问题,它以“不会修复”结束;简短的讨论值得一读)。