使用Python的UserDict模块
我正在通过《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 编写的,用户可以继承它来调整行为。