8.12. UserDict — 字典对象的类包装器 — Python 文档

来自菜鸟教程
Python/docs/2.7/library/userdict
跳转至:导航、​搜索

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),UserDictIterableUserDict 实例提供以下属性:

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; 但是,它可用于将类似列表的接口包装在其他对象(例如持久存储)周围。

此外,此类可以使用多重继承与内置类混合。 这有时很有用。 例如,您可以同时继承 UserListstr。 对于真实的 list 和真实的 str,这是不可能的。


该模块定义了一个类,该类充当列表对象的包装器。 它是您自己的类似列表的类的有用基类,可以从它们继承并覆盖现有方法或添加新方法。 通过这种方式,人们可以向列表添加新行为。

UserList 模块定义了 UserList 类:

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 类的内容。