【发布时间】:2014-10-17 08:21:48
【问题描述】:
今天编码,上述哪一个是首选和推荐的(在 Python 2 和 3 中)用于子类化?
我读到 UserList 和 UserDict 已被引入,因为过去 list 和 dict 不能被子类化,但既然这不再是问题,是否鼓励使用它们?
【问题讨论】:
标签: python list dictionary subclass
今天编码,上述哪一个是首选和推荐的(在 Python 2 和 3 中)用于子类化?
我读到 UserList 和 UserDict 已被引入,因为过去 list 和 dict 不能被子类化,但既然这不再是问题,是否鼓励使用它们?
【问题讨论】:
标签: python list dictionary subclass
根据您的用例,这些天您可以直接将list 和dict 子类化,也可以将collections.MutableSequence and collections. MutableMapping 子类化;除了使用User* 对象之外,还有这些选项。
User* 对象已移至 Python 3 中的 collections 模块;但是在 Python 2 标准库中使用的任何代码都已替换为 collections.abc 抽象基类。即使在 Python 2 中,UserList 和 UserDict 也是增强的 collections.* 实现,添加方法 list 和 dict 提供超出基本接口的功能。
collections 类使您的子类成为一个完整实现必须实现的内容更加清晰,并且还允许您实现更小的子集(例如 collections.Mapping,实现只读映射,或 collections.Sequence 用于一个类似元组的对象)。
User* 实现应该在您还需要实现基本接口之外的所有内容时使用;例如如果您需要像list 那样支持加法、排序、反转和计数。
对于其他任何事情,使用collections 抽象基类作为基础几乎总是更好;内置类型针对速度进行了优化,并且对子类不太友好。例如,您需要重写 list 上通常返回新的 list 的几乎所有方法,以确保返回您的子类。
仅当您需要构建坚持使用list 或dict 对象的代码(通过使用isinstance() 进行测试是子类化类型的选项考虑。这就是为什么@例如,987654347@ 是dict 的子类。
【讨论】:
list 而不是collections.Sequence,反之亦然?
不不再鼓励他们。您不应该使用 UserDict 类,因为它是 deprecated。文档说你可以直接继承dict。 userdict 模块在 Python 3.0 中消失了
【讨论】:
Moved to the 'collections' module.。如果不再鼓励他们,为什么要保留最新版本?它们与标准类型有什么不同?
collections.MutableMapping 和 collections.Sequence。
UserList 子类化并获得排序和(在Python 2 中)切片以正常工作与必须覆盖list 类型上的所有内容相比更容易。
User* 类在需要访问底层数据结构时更容易使用,因为它可以作为属性访问。