今天进行编码,上述哪一项是优选的,并推荐(在Python 2和3中)用于子类化?
我读到UserList
和UserDict
已被引入,因为过去list
和dict
无法进行子类化,但因为这不再是问题了,是否鼓励使用它们?
答案 0 :(得分:13)
根据您的用例,这些天您可以直接子类list
和dict
,也可以继承collections.MutableSequence
and collections. MutableMapping
;这些选项另外使用User*
对象。
{3}对象已移至Python 3中的User*
模块;但是使用Python 2 stdlib中的代码的任何代码都已被collections
抽象基类替换。即使在Python 2中,collections.abc
和UserList
也是增强的UserDict
实现,在基本界面之外添加方法collections.*
和list
。
dict
类使您的子类成为完整实现必须实现的更清晰,并且还允许您实现更小的子集(例如collections
,实现只读映射,或者对于类似元组的对象,collections.Mapping
。
当您需要实现基本界面之外的所有内容时,应使用collections.Sequence
实现;例如如果您需要像User*
那样支持添加,排序,反转和计数。
对于其他任何事情,你最好总是使用list
抽象基类作为基础;内置类型针对速度进行了优化,并不是子类友好的。例如,您需要覆盖collections
上通常返回新list
的每个方法,以确保返回您的子类。
只有当您需要构建坚持使用list
或list
对象的代码时(使用dict
进行测试)才会将类型子类化为一个选项考虑。这就是为什么isinstance()
是collections.OrderedDict
的子类,例如。
答案 1 :(得分:6)
不他们不再受到鼓励。您不应该使用UserDict类,因为它是deprecated。文档说你可以直接将dict
子类化。 {3.0}中的userdict
模块消失了