【问题标题】:Python Data Model, Type Protocols, & Magic MethodsPython 数据模型、类型协议和魔术方法
【发布时间】:2021-06-26 16:01:12
【问题描述】:

对于不同的 python 类型和它们必须实现的魔法方法,是否有“思维导图”、UML 图、图形或一些可靠的参考?

我使用的是 Python 3.8。 data model docsbuilt-in types docs 文档非常简洁,它可以帮助我看到 Python 中不同类型存在的不同协议的高级概述(我已经“学习”(读过?),例如,要实现“类不可变”对象,必须遵守python中的Immutable Protocol,即必须实现__len____getitem__。要使其“类可变”,必须进一步添加__setitem____delitem__)。

我没有看到(据我搜索)python 文档中使用的“协议”一词,最接近的描述似乎来自collections abstract base classes 模块。但是,作为一个新手,我不确定collections.abc 是否完全是另一回事,或者那里提供的信息是否适用于python 内置类型(即listtupledict 等;特别是因为collections.abc 文档声明它“提供[es] Python 的通用内置容器、dict、list、set 和 tuple 的替代品”,其次是因为如果我不考虑使用collections 模块想了解python语言本身的默认内置函数)。

有人有可靠的资源吗?如果信息采用某种继承关系格式,这样信息就不会重复,那将很有帮助。例如,在我上面的示例中,与其说mutable-like 对象实现了__len____getitem____setitem____delitem__,不如说如果它被“分块”,我的小脑袋更容易掌握" 并且信息类似于 "mutable-like 对象继承自 immutable-like 并添加 __setitem____delitem__

有什么想法吗?我认为这对新手来说是一个巨大的困惑来源,许多错误是由于对 python 中的数据类型的误解造成的。

【问题讨论】:

    标签: python magic-methods datamodel


    【解决方案1】:

    the glossary 构建很多东西,这是我目前能做的最好的事情。我希望这个问题可以通过其他人的多个答案来扩展。

    定义

    • 可变的:一个对象其值可以在实例化后改变
    • 不可变:一个对象实例化后其值不能改变
    • 容器:包含对其他对象的引用的对象
    • 序列:一个由非负数索引的有限有序集
    • 映射:有限集任意索引集索引的对象
    • Callable:类型可以应用到函数调用操作
    • Number (numbers):一个支持数字运算的不可变
    • 范围:一个不可变数字序列
    • 字符串: 不可变序列索引访问的字符
    • 字节:一个不可变序列短整数
    • List ([]):索引访问的对象引用的可变序列
    • 字典 ({key: value}):key 访问的对象引用的可变映射
    • 元组 (()):索引访问的对象引用的不可变序列
    • Set ({}):可变唯一和不可变对象的无序集合
    • Frozen Set:一个不可变可散列唯一和可散列对象的集合

    类型

    • Orderable/Comparable: 实现__eq__()__lt__()__le__()__gt__()__ge__()。对于遏制检查(即与in 一起使用),实现__contains__() 或者是Iterable
    • 可迭代:一个能够一次返回一个成员的对象
    • 迭代器:实现__iter__()(返回对象)和__next__()(从容器返回下一个项目;完成时引发StopIteration
    • 生成器:实现__iter__()(产生对象)和__next__()(产生容器中的下一个项目;完成时引发StopIteration
    • 不可变序列: 实现 __hash__()
    • 上下文可管理:实现__enter__()__exit__()(用于with 语句)
    • 描述符: 实现__get__()__set__() 和/或__delete__()

    重载操作

    • 序列:
      • +串联
      • *重复1

    1 注意:序列中的重复项不会被复制,而是被多次引用。要制作唯一的副本,请使用列表推导式或生成器表达式。

    补充说明

    • built-in 类型是所有lower case 对象(例如listtuplestr 等)
    • 所有Sequences都是Iterables
    • 要从旧的不可变对象创建新的不可变对象,必须创建一个新对象
    • SetsDicitionaries 也支持理解
    • Bitwise Operations 可用于 Sets 以实现集合论运算(即并集、交集、对称差等)

    序列类型的概念分组

    1. 容器/平面序列

      • Container Sequences:可以容纳不同类型的项目(list, tuple, collections.deque)
      • Flat Sequences:只能容纳一种类型的项目(str, bytes, bytearray, memoryview, array.array)
    2. 可变/不可变序列

      • 可变序列: list, bytearray, array.array, collections.deque, memoryview
      • 不可变序列: tuple, str, bytes

    另一个很好的参考是Fluent Python, by Luciano Ramalho

    【讨论】:

      猜你喜欢
      • 2014-08-05
      • 2018-01-16
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多