我正在从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 属性作为字典?
请告诉我这里是否有什么误解。
答案 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