Python 数据模型、类型协议和魔术方法

A. *_*dry 4 python datamodel magic-methods

是否有“思维导图”、UML 图、图形或一些针对不同 Python 类型及其必须实现的神奇方法的可靠参考?

\n

我正在使用 Python 3.8。数据模型文档内置类型文档非常简洁,它将帮助我了解 python 中不同类型存在的不同协议的高级概述(我已经“学习”(阅读?) ,例如,要实现“类似不可变”的对象,您必须遵守Immutable ProtocolPython中的 ,这意味着您必须实现__len____getitem__。要使其“类似可变”,您必须进一步添加__setitem____delitem__)。

\n

我没有看到(据我搜索到的)Python 文档中使用了“协议”一词,并且最接近的良好描述似乎来自集合抽象基类模块。然而,作为一个新手,我不确定是否collections.abc完全是别的东西,或者那里提供的信息是否适用于 python 内置类型(即listtupledict等;特别是因为collections.abc文档指出它“提供[es]替代方案)到 Python\xe2\x80\x99s 通用内置容器、字典、列表、集合和元组”,第二个是因为我不会想到去collections Python\xe2\x80\x99s 通用内置容器、字典、列表、集合和元组”,其次是因为如果我想了解 python 中的默认内置函数,模块语言本身)。

\n

有人有可靠的资源吗?如果信息采用某种继承关系格式,这样信息就不会重复,这将很有帮助。例如,在我上面的例子中,与其说一个mutable-like对象实现了__len____getitem____setitem____delitem__,不如说如果它被“分块”并且信息类似于“一个mutable-like对象继承immutable-like并添加__setitem__,和__delitem__

\n

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

\n

A. *_*dry 5

Python数据模型

从术语表中构建了很多内容,这是我目前能做的最好的事情。我希望这个问题可以通过其他人的多个答案来扩展。

定义

  • 可变:实例化后其值可以改变的对象
  • 不可变:实例化后其值不能改变的对象
  • 容器:包含对其他对象的引用的对象
  • 序列:由非负数索引的有限有序
  • 映射:由任意索引集索引的有限对象集
  • Callable:类型可以与函数调用操作一起应用
  • Number ( numbers):支持数字运算的不可变
  • 范围:不可变的数字序列
  • 字符串:通过索引访问的不可变字符序列
  • 字节:不可变的短整数序列
  • List ( []):通过索引访问的对象引用的可变序列
  • Dictionary ( {key: value}):通过访问的对象引用的可变映射
  • Tuple ( ()):通过索引访问的对象引用的不可变序列
  • Set( {}):唯一且不可变对象的可变无序集合
  • 冻结集:唯一且可哈希对象的不可变可哈希的集合

类型

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

重载操作

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

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

补充评论

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

序列类型的概念分组

  1. 容器/平面序列

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

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

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