在编写代码时,对于Python 2和3的子类化,哪个更受推荐和推崇?
我了解到 UserList
和 UserDict
已经被引入,是因为过去无法对list
和dict
进行子类化,但由于这不再是一个问题,那么是否鼓励使用它们?
在编写代码时,对于Python 2和3的子类化,哪个更受推荐和推崇?
我了解到 UserList
和 UserDict
已经被引入,是因为过去无法对list
和dict
进行子类化,但由于这不再是一个问题,那么是否鼓励使用它们?
list
和dict
,或者你可以子类化collections.MutableSequence
和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()
测试)的代码时,考虑子类化类型是一种选择。例如,这就是为什么collections.OrderedDict
是dict
的子类。
collections.MutableMapping
和collections.Sequence
。 - user3414693list
类型上覆盖所有内容相比,通过继承UserList
更容易实现正确排序和(在Python 2中)切片操作。 - Martijn Pieters
list
而不是collections.Sequence
或反之亦然? - linkyndy