使用python的UserDict模块

使用python的UserDict模块,python,object,Python,Object,我正在从diveintopython一书中学习python。 在问这个问题之前,我参考了给出的答案并阅读了给出的文档,但它们并没有明确说明我想知道什么 在这本书中,一个类UserDict被编写为 class UserDict: def __init__(self, dict=None): self.data = {} if dict is not None: self.update(dict) 接下来提到了另一个类FileInfo class FileI

我正在从diveintopython一书中学习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属性作为字典


请告诉我这里是否有我误解的地方。

您没有展示更多的
UserDict
实现(否则它就不会有一个
更新
方法)。。。这本书很可能是在展示一段历史

在用户可以直接将dict子类化之前,这个类可能非常有用。基本上,它允许用户创建看起来和行为都像dict的对象——然后他们可以为特定的目的调整行为(考虑中提供的所有dict子类)。现在,由于您可以直接将
dict
子类化(或使用
collections.MutableMapping
ABC)来创建自己的类似dict的类,因此几乎不再需要
UserDict
,它只支持遗留代码



现在就实现而言,由于它们不能直接将
dict
子类化,所以它们通过提供相同的接口。他们可以简单地将dictionary方法委托给底层dict(
self.data
)。通过这种方式,他们知道他们有一个几乎在所有方面都像dict的对象。而且,由于它是在纯python中构建的,用户可以对它进行子类化以调整行为。

这在python 3.x中现在不直接支持

一种解决方法是使用collection类并添加以下内容:


从集合导入UserDict

正如您在回答中所说,“它允许用户创建外观和行为类似于dict的对象”,为什么对象本身不是字典,即self={},而是self.data={}?这是我的问题,如果您在函数内部设置
self={}
(而且您可以),但是更改不会传播到函数之外。。。