使用Python的UserDict模块

1 投票
2 回答
3843 浏览
提问于 2025-04-18 09:46

我正在通过《Dive Into Python》这本书学习Python。在问这个问题之前,我查阅了这里的回答,并阅读了这里的文档,但它们并没有明确解答我想知道的内容。

在书中,有一个叫做UserDict的类,写成了这样:

class UserDict:
    def __init__(self, dict=None):
        self.data = {}
        if dict is not None: self.update(dict)

接下来提到了另一个类FileInfo,

class FileInfo(UserDict):
    "store file metadata"
     def __init__(self, filename=None):
         UserDict.__init__(self)
         self["name"] = filename

我的问题是,UserDict类的一个对象有一个属性data,这个属性是一个字典。当我创建FileInfo类的对象时,这个对象继承了这个属性,但为什么这个对象本身是一个字典,而不是拥有一个data属性作为字典呢?

如果我在这里有什么误解,请告诉我。

2 个回答

0

现在在Python 3.x中,这个功能并没有直接支持。

一种解决方法是使用集合类,然后添加以下内容:

from collections import UserDict

1

你没有展示完整的 UserDict 实现(否则它就不会有 update 方法了)……很可能书中展示的是标准库中 UserDict 的实现

这个类在以前的时代非常有用,那时候用户不能直接继承 dict。基本上,它允许用户创建看起来和行为都像字典的对象——然后用户可以根据特定的需求调整它的行为(想想在 collections 模块中提供的所有字典子类)。现在,因为你可以直接继承 dict(或者使用 collections.MutableMapping 这个抽象基类)来创建自己的类,所以几乎不再需要 UserDict 了——它现在只为旧代码提供支持。


至于实现方面,由于他们不能直接继承 dict,所以通过 “组合” 提供了相同的接口。他们可以简单地将字典的方法委托给底层的字典(self.data)。这样,他们就 知道 他们有一个在几乎所有方面都像 dict 的对象。而且,由于它是用纯 Python 编写的,用户可以继承它来调整行为。

撰写回答