【问题标题】:list vs UserList and dict vs UserDictlist vs UserList 和 dict vs UserDict
【发布时间】:2014-10-17 08:21:48
【问题描述】:

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

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

【问题讨论】:

    标签: python list dictionary subclass


    【解决方案1】:

    根据您的用例,这些天您可以直接将listdict 子类化,也可以将collections.MutableSequence and collections. 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() 进行测试是子类化类型的选项考虑。这就是为什么@例如,987654347@ 是dict 的子类。

    【讨论】:

    • 子类化它们每个对子类化它们的对应物有什么不同?为什么我应该使用list 而不是collections.Sequence,反之亦然?
    • @AndreiHorak:- 再补充一句,您可以查看一个问题来帮助您了解更多信息:bugs.python.org/issue5402
    【解决方案2】:

    不再鼓励他们。您不应该使用 UserDict 类,因为它是 deprecated。文档说你可以直接继承dictuserdict 模块在 Python 3.0 中消失了

    【讨论】:

    • 在您提供的链接中指定了Moved to the 'collections' module.。如果不再鼓励他们,为什么要保留最新版本?它们与标准类型有什么不同?
    • @AndreiHorak:- 从 Python 2.6 版本开始,建议改用 collections.MutableMappingcollections.Sequence
    • @AndreiHorak:它们并没有真正被弃用,因为事实证明这些类有它们的用途;将UserList 子类化并获得排序和(在Python 2 中)切片以正常工作与必须覆盖list 类型上的所有内容相比更容易。
    • 没有。与the docs say 一样,User* 类在需要访问底层数据结构时更容易使用,因为它可以作为属性访问。
    猜你喜欢
    • 2012-03-29
    • 2012-06-03
    • 1970-01-01
    • 2012-08-07
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 2011-01-10
    相关资源
    最近更新 更多