list vs UserList和dict vs UserDict

lin*_*ndy 11 python dictionary list subclass

编码这一天,上面哪一个是首选的,并推荐(在Python 2和3中)进行子类化?

我读过这篇文章UserList并且UserDict已经介绍了,因为过去list并且dict不能被分类,但由于这不再是一个问题,是否鼓励使用它们?

Mar*_*ers 14

根据您的用例,这些日子里,你会要么子类listdict直接,或者你也可以继承collections.MutableSequencecollections. MutableMapping ; 除了使用User*对象之外,还有这些选项.

User*对象已经被移动到collections在Python 3模块; 但任何使用Python 2 stdlib中的代码的代码都已被collections.abc抽象基类所取代.甚至在Python 2,UserListUserDict被增强的collections.*实现方式中,添加方法listdict提供超出了基本接口.

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

User*当您需要实现基本接口之外的所有内容时,应该使用这些实现; 例如,如果您需要支持添加,排序,反转和计数,就像这样list做.

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

只有当你需要构建坚持使用listdict对象的代码时(通过使用测试isinstance()是将类型子类化为一个选项来考虑.这就是为什么它collections.OrderedDictdict例如的子类).

  • @AndreiHorak: - 只是补充一下你可以查看一个有助于你了解更多的问题:http://bugs.python.org/issue5402 (2认同)

Rah*_*thi 6

不,他们不再受到鼓励了.您不应该使用UserDict类,因为它已被弃用.文档说你可以直接子类化dict.该userdict模块已在Python 3.0中消失

  • @AndreiHorak: - 从Python 2.6版开始,建议使用`collections.MutableMapping`和`collections.Sequence`. (2认同)
  • @AndreiHorak:他们并没有真正被弃用,因为事实证明这些类有其用途;子类化UserList并获得排序和切片(在Python 2中)更容易,而不必重写list上的所有内容。 (2认同)