8.12. UserDict —字典对象的类包装

源代码: Lib/UserDict.py


该模块定义一个 mixin DictMixin,为已经具有最小 Map 接口的类定义所有字典方法。这极大地简化了需要替换为词典的编写类(例如 shelve 模块)。

该模块还定义了一个类UserDict,该类充当字典对象的包装器。可以直接从dict继承子类(此Function自 Python 2.2 版开始可用)已大大取代了对此类的需要。在引入dict之前,使用UserDict类创建类似于字典的子类,这些子类pass覆盖现有方法或添加新方法来获得新行为。

UserDict模块定义UserDict类和DictMixin

    • class * UserDict. UserDict([* initialdata *])
    • 模拟字典的类。实例的内容保存在常规字典中,可passUserDict实例的data属性访问。如果提供了* initialdata ,则data将使用其内容进行初始化;请注意,将不会保留对 initialdata *的引用,允许将其用于其他目的。

Note

为了向后兼容,UserDict的实例不可迭代。

    • class * UserDict. IterableUserDict([* initialdata *])
    • UserDict的子类支持直接迭代(例如for key in myDict)。

除了支持 Map 的方法和操作(请参见Map 类型— dict)之外,UserDictIterableUserDict实例还提供以下属性:

  • IterableUserDict. data

    • 一个 true 的字典,用于存储UserDict类的内容。
  • 类别 UserDict. DictMixin

此 mixin 应该用作超类。添加上述每种方法都会逐渐增加更多Function。例如,定义除delitem()以外的所有内容,只会从完整界面中排除pop()popitem()

除了四种基本方法外,定义contains()iter()iteritems()带来了越来越多的效率。

由于 mixin 不了解子类构造函数,因此不会定义init()copy()

从 Python 2.6 版开始,建议使用collections.MutableMapping而不是DictMixin

请注意,DictMixin 不实现viewkeys()viewvalues()viewitems()方法。

8.13. UserList —列表对象的类包装

Note

当 Python 2.2 发布时,该类的许多用例都被直接子类list所包含。但是,仍然有少数用例。

该模块提供了围绕底层数据存储的列表接口。默认情况下,该数据存储为list;但是,它可以用于在其他对象(例如持久性存储)周围包装类似列表的接口。

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

该模块定义一个类,充当列表对象的包装器。它是您自己的类似列表的类的有用 Base Class,可以从它们继承并覆盖现有方法或添加新方法。这样,可以将新行为添加到列表中。

UserList模块定义UserList类:

  • 类别 UserList. UserList([列表])
    • 模拟列表的类。实例的内容保存在常规列表中,可passUserList实例的data属性进行访问。实例的内容最初设置为* list *的副本,默认为空列表[]。 * list *可以是任意迭代的,例如真实的 Python 列表或UserList对象。

Note

UserList类已移至 Python 3 中的collections模块。2to3工具在将源转换为 Python 3 时将自动适应导入。

除了支持可变序列的方法和操作(请参见序列类型— str,unicode,list,tuple,bytearray,buffer,xrange)之外,UserList实例还提供以下属性:

  • UserList. data
    • 一个 true 的 Python 列表对象,用于存储UserList类的内容。

子类要求: UserList的子类应提供一个构造函数,该构造函数可以不带任何参数也可以不带一个参数而调用。返回新序列的列表操作try创建实际实现类的实例。为此,假定可以使用单个参数调用构造函数,该参数是用作数据源的序列对象。

如果派生类不希望遵守此要求,则该类支持的所有特殊方法都将被覆盖;请咨询资源以获取有关在这种情况下需要提供的方法的信息。

在版本 2.0 中进行了更改:Python 版本 1.5.2 和 1.6 还要求构造函数可以不带参数地调用,并提供可变的data属性。早期版本的 Python 并未try创建派生类的实例。

8.14. UserString —字符串对象的类包装

Note

该模块中的此类UserString仅可用于向后兼容。如果您编写的代码不需要使用 Python 2.2 之前的版本,请考虑直接从内置str类型子类化,而不是使用UserString(没有等效于MutableString的内置子类)。

该模块定义一个类,充当字符串对象的包装器。对于您自己的类似字符串的类,它是一个有用的 Base Class,可以从它们继承并覆盖现有方法或添加新方法。这样,可以向字符串添加新行为。

应该注意的是,与 true 的字符串或 Unicode 对象相比,这些类的效率非常低。 MutableString尤其如此。

UserString模块定义以下类别:

  • 类别 UserString. UserString([序列])
    • 模拟字符串或 Unicode 字符串对象的类。实例的内容保存在常规字符串或 Unicode 字符串对象中,可passUserString实例的data属性访问。实例的内容最初设置为* sequence *的副本。 * sequence *可以是常规 Python 字符串或 Unicode 字符串,UserString(或子类)的实例或可以使用内置str()函数转换为字符串的任意序列。

Note

UserString类已移至 Python 3 中的collections模块。2to3工具在将源转换为 Python 3 时将自动适应导入。

  • 类别 UserString. MutableString([序列])
    • 此类从上面的UserString派生,并将字符串重新定义为* mutable 。可变字符串不能用作字典键,因为字典需要 immutable *对象作为键。此类的主要目的是作为继承的教育示例,并且有必要删除(重写)hash()方法,以捕获try将可变对象用作字典键的try,否则该try很容易出错并且很难跟踪下。

自 2.6 版起弃用:MutableString类已在 Python 3 中删除。

除了支持字符串和 Unicode 对象的方法和操作(请参见String Methods)之外,UserString实例还提供以下属性:

  • MutableString. data
    • 一个真实的 Python 字符串或 Unicode 对象,用于存储UserString类的内容。