列表 vs 用户列表和字典 vs 用户字典

17

在编写代码时,对于Python 2和3的子类化,哪个更受推荐和推崇?

我了解到 UserListUserDict 已经被引入,是因为过去无法对listdict 进行子类化,但由于这不再是一个问题,那么是否鼓励使用它们?

2个回答

21
根据你的使用情况,现在你可以直接子类化listdict,或者你可以子类化collections.MutableSequencecollections.MutableMapping;这些选项是为了增强使用User*对象而提供的。 User*对象已经在Python 3中移动到collections模块;但是在Python 2标准库中使用这些对象的任何代码都被替换为collections.abc抽象基类。即使在Python 2中,UserListUserDict也是增强的collections.*实现,添加了listdict提供的方法,超出了基本接口。 collections类让您更清楚地知道必须为您的子类实现什么才能成为完整的实现,并且还允许您实现更小的子集(例如实现只读映射的collections.Mapping或用于类似元组的对象的collections.Sequence)。
当您需要实现超出基本接口的所有内容时应使用User*实现;例如,如果您需要像list一样支持添加、排序、反转和计数。
对于其他任何事情,您几乎总是最好使用collections抽象基类作为基础;内置类型经过优化以提高速度,并不太适合子类化。例如,在list上,您需要覆盖几乎每个方法,以确保返回您的子类而不是通常返回一个新的list

只有在需要构建坚持使用listdict对象(通过使用isinstance()测试)的代码时,考虑子类化类型是一种选择。例如,这就是为什么collections.OrderedDictdict的子类。


1
子类化它们各自的副本有什么不同?为什么我应该使用list而不是collections.Sequence或反之亦然? - linkyndy
2
@AndreiHorak:只是想补充一下,你可以查看一个问题,这将有助于你更好地理解:http://bugs.python.org/issue5402 - user3414693

4
,现在已经不再鼓励使用它们了。你不应该使用UserDict类,因为它已经被弃用了。文档中说,你可以直接从dict进行子类化。userdict模块在Python 3.0中已经消失了。

1
在您提供的链接中,指定了“已移至'collections'模块。”如果它们不再被鼓励使用,为什么它们会被保留在最新版本中?与标准类型相比,它们带来了什么不同之处? - linkyndy
2
@AndreiHorak:从Python 2.6版本开始,建议使用collections.MutableMappingcollections.Sequence - user3414693
4
他们并不是真正的弃用,因为这些类有它们的用途;与在list类型上覆盖所有内容相比,通过继承UserList更容易实现正确排序和(在Python 2中)切片操作。 - Martijn Pieters
1
根据文档所述,当需要访问基础数据结构时,User*类可以更易于使用,因为它可以作为属性访问。 - Jeyekomon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接