使用python的UserDict模块

时间:2014-06-14 05:10:55

标签: python object

我正在从diveintopython这本书中学习python。 在提出这个问题之前,我已经查阅了here给出的答案并阅读了here给出的文档,但他们并没有明确说明我想知道的内容。

在本书中,类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 :(得分:0)

你没有展示UserDict的更多实现(例如,它不会有update方法)...很可能这本书展示了一部分UserDict implementation in the standard library

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


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

答案 1 :(得分:0)

Python 3.x现在不直接支持此功能

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

from collections import UserDict