list vs UserList和dict vs UserDict

时间:2014-08-23 17:40:36

标签: python list dictionary subclass

今天进行编码,上述哪一项是优选的,并推荐(在Python 2和3中)用于子类化?

我读到UserListUserDict已被引入,因为过去listdict无法进行子类化,但因为这不再是问题了,是否鼓励使用它们?

2 个答案:

答案 0 :(得分:13)

根据您的用例,这些天您可以直接子类listdict,也可以继承collections.MutableSequence and collections. MutableMapping;这些选项另外使用User*对象。

{3}对象已移至Python 3中的User*模块;但是使用Python 2 stdlib中的代码的任何代码都已被collections抽象基类替换。即使在Python 2中,collections.abcUserList也是增强的UserDict实现,在基本界面之外添加方法collections.*list

dict类使您的子类成为完整实现必须实现的更清晰,并且还允许您实现更小的子集(例如collections,实现只读映射,或者对于类似元组的对象,collections.Mapping

当您需要实现基本界面之外的所有内容时,应使用collections.Sequence实现;例如如果您需要像User*那样支持添加,排序,反转和计数。

对于其他任何事情,你最好总是使用list抽象基类作为基础;内置类型针对速度进行了优化,并不是子类友好的。例如,您需要覆盖collections上通常返回新list的每个方法,以确保返回您的子类。

只有当您需要构建坚持使用listlist对象的代码时(使用dict进行测试)才会将类型子类化为一个选项考虑。这就是为什么isinstance()collections.OrderedDict的子类,例如。

答案 1 :(得分:6)

他们不再受到鼓励。您不应该使用UserDict类,因为它是deprecated。文档说你可以直接将dict子类化。 {3.0}中的userdict模块消失了