8.12. UserDict — 字典对象的类包装器 — Python 文档
8.12. 用户字典 — 字典对象的类包装器
源代码: :source:`Lib/UserDict.py`
该模块定义了一个 mixin,DictMixin,为已经具有最小映射接口的类定义了所有字典方法。 这大大简化了需要替换字典的类的编写(例如 shelve 模块)。
该模块还定义了一个类 UserDict,它充当字典对象的包装器。 对此类的需求在很大程度上已被直接从 dict(从 Python 2.2 版开始可用的功能)的子类化能力所取代。 在引入 dict 之前,UserDict 类用于创建类似字典的子类,这些子类通过覆盖现有方法或添加新方法来获得新行为。
UserDict 模块定义了 UserDict 类和 DictMixin:
- class UserDict.UserDict([initialdata])
模拟字典的类。 实例的内容保存在常规字典中,可通过 UserDict 实例的
data
属性访问。 如果提供了 initialdata,则用其内容初始化data
; 请注意,将不会保留对 initialdata 的引用,允许将其用于其他目的。笔记
为了向后兼容,UserDict 的实例不可迭代。
- class UserDict.IterableUserDict([initialdata])
- UserDict 支持直接迭代的子类(例如
for key in myDict
)。
除了支持映射的方法和操作(参见 Mapping Types — dict),UserDict 和 IterableUserDict 实例提供以下属性:
- IterableUserDict.data
- 一个真正的字典,用于存储 UserDict 类的内容。
- class UserDict.DictMixin
Mixin 为已经具有最小字典接口的类定义了所有字典方法,包括
__getitem__()
、__setitem__()
、__delitem__()
和keys()
。这个 mixin 应该用作超类。 添加上述每个方法都会逐渐增加更多的功能。 例如,定义除
__delitem__()
之外的所有内容将仅从完整界面中排除pop()
和popitem()
。除了四种基本方法之外,定义
__contains__()
、__iter__()
和iteritems()
会逐渐提高效率。由于 mixin 不知道子类构造函数,因此它没有定义
__init__()
或 copy()。从 Python 2.6 版本开始,建议使用 collections.MutableMapping 而不是 DictMixin。
请注意,DictMixin 没有实现 viewkeys()、viewvalues() 或 viewitems() 方法。
8.13. 用户列表 — 列表对象的类包装器
笔记
当 Python 2.2 发布时,该类的许多用例都包含在直接对 list
进行子类化的能力中。 但是,仍然存在少数用例。
该模块提供了一个围绕底层数据存储的列表接口。 默认情况下,该数据存储是 list
; 但是,它可用于将类似列表的接口包装在其他对象(例如持久存储)周围。
此外,此类可以使用多重继承与内置类混合。 这有时很有用。 例如,您可以同时继承 UserList 和 str。 对于真实的 list
和真实的 str,这是不可能的。
该模块定义了一个类,该类充当列表对象的包装器。 它是您自己的类似列表的类的有用基类,可以从它们继承并覆盖现有方法或添加新方法。 通过这种方式,人们可以向列表添加新行为。
- class UserList.UserList([list])
模拟列表的类。 实例的内容保存在一个常规列表中,可以通过 UserList 实例的 data 属性访问该列表。 实例的内容最初设置为 list 的副本,默认为空列表
[]
。 list 可以是任何可迭代的,例如 一个真正的 Python 列表或一个 UserList 对象。笔记
UserList 类已移至 Python 3 中的 collections 模块。 2to3 工具将在将您的源代码转换为 Python 3 时自动调整导入。
除了支持可变序列的方法和操作(参见序列类型——str、unicode、list、tuple、bytearray、buffer、xrange),UserList实例提供以下属性:
- UserList.data
- 一个真正的 Python 列表对象,用于存储 UserList 类的内容。
子类化要求: UserList 的子类应提供一个构造函数,该构造函数可以不带参数或一个参数调用。 返回新序列的列表操作尝试创建实际实现类的实例。 为此,它假定可以使用单个参数调用构造函数,该参数是用作数据源的序列对象。
如果派生类不希望遵守此要求,则需要覆盖该类支持的所有特殊方法; 有关在这种情况下需要提供的方法的信息,请咨询来源。
2.0 版更改:Python 1.5.2 和 1.6 版还要求构造函数可以无参数调用,并提供可变的 data
属性。 早期版本的 Python 没有尝试创建派生类的实例。
8.14. 用户字符串 — 字符串对象的类包装器
笔记
此模块中的 UserString 类仅可用于向后兼容。 如果您编写的代码不需要使用 Python 2.2 之前的 Python 版本,请考虑直接从内置 str 类型进行子类化,而不是使用 UserString(有没有与 MutableString 等效的内置函数)。
该模块定义了一个类,该类充当字符串对象的包装器。 它是您自己的类似字符串的类的有用基类,可以从它们继承并覆盖现有方法或添加新方法。 通过这种方式,人们可以向字符串添加新的行为。
应该注意的是,与真正的字符串或 Unicode 对象相比,这些类的效率非常低; MutableString 尤其如此。
UserString 模块定义了以下类:
- class UserString.UserString([sequence])
模拟字符串或 Unicode 字符串对象的类。 实例的内容保存在常规字符串或 Unicode 字符串对象中,可通过 UserString 实例的
data
属性访问。 实例的内容最初设置为 序列 的副本。 sequence 可以是常规 Python 字符串或 Unicode 字符串、UserString 的实例(或子类)或可以使用内置 [ X207X]str() 函数。笔记
UserString 类已移至 Python 3 中的 collections 模块。 2to3 工具将在将您的源代码转换为 Python 3 时自动调整导入。
- class UserString.MutableString([sequence])
此类派生自上面的 UserString,并将字符串重新定义为 mutable。 可变字符串不能用作字典键,因为字典需要 immutable 对象作为键。 此类的主要目的是作为继承的教育示例,并且需要删除(覆盖)
__hash__()
方法以捕获尝试使用可变对象作为字典键的尝试,否则会非常错误容易且难以追踪。自 2.6 版起已弃用:MutableString 类已在 Python 3 中删除。
除了支持字符串和 Unicode 对象的方法和操作(参见 String Methods),UserString 实例还提供以下属性:
- MutableString.data
- 一个真正的 Python 字符串或 Unicode 对象,用于存储 UserString 类的内容。