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

4

是否有一个“思维导图”,UML图表,图形或某些实际参考资料来说明不同Python类型及其必须实现的魔术方法?

我正在使用Python 3.8。data model docsbuilt-in types docs文档非常简洁,如果能看到Python中不同类型的不同协议的总体概述将会很有帮助(例如,我已经“学习”(阅读?)了,要实现“类似不可变”的对象,必须遵守Python中的Immutable Protocol,这意味着您必须实现__len____getitem__。要使其“类似可变”,您必须进一步添加__setitem____delitem__)。

我在Python文档中搜索了很久,没有找到使用“protocol”这个词的地方。最接近的描述似乎来自collections抽象基类模块。然而,作为一个新手,我不确定collections.abc是否完全不同,或者那里提供的信息是否适用于Python内置类型(即listtupledict等)。特别是因为collections.abc文档指出它“提供了替代Python通用内置容器dict、list、set和tuple”,其次是因为如果我想学习Python语言本身的默认内置函数,我不会想到去collections模块。
有没有可靠的资源?最好是采用继承关系格式,以免重复信息。例如,在我的示例中,与其说一个 mutable-like 对象实现 __len__, __getitem__, __setitem__, 和 __delitem__,如果它被"分块"并且信息是 "一个 mutable-like 对象从 immutable-like 继承而来,并添加了 __setitem____delitem__",那么对于我这种脑容量有限的人来说会更容易理解。

有什么想法吗?我认为这是新手困惑的重要原因之一,很多错误都源自于对 Python 数据类型的误解。

1个回答

5

Python Data Model

根据术语表的内容,这是我目前能做到的最好的。希望其他人能提供更多答案来扩展这个问题。

定义

  • Mutable:一个在实例化后其值可以改变的对象
  • Immutable:一个在实例化后其值不能改变的对象
  • Container:一个包含对其他对象的引用的对象
  • Sequence:一个由非负数索引的有限有序集合
  • Mapping:一个由任意索引集合索引的有限集合对象
  • Callable:可应用函数调用操作的类型
  • Number (numbers):支持数值操作的不可变
  • Range:一系列不可变的数字
  • String:通过索引访问的不可变字符序列
  • Byte:一系列不可变的短整数
  • List ([]):通过索引访问的可变对象序列
  • Dictionary ({key: value}):通过访问的可变映射对象
  • Tuple (()):通过索引访问的不可变对象序列
  • Set ({}):可变无序唯一且不可变对象集合
  • Frozen Set:不可变可哈希唯一且可哈希对象集合

类型

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

操作重载

  • 序列:
    • + 表示连接
    • * 表示重复2

2 注意:在序列中,重复的项并不会被复制,而是被多次引用。如果需要创建独立的副本,请使用列表推导式或生成器表达式。

附加评论

  • 内置类型是所有小写对象(例如列表、元组、字符串等)
  • 所有序列都是可迭代的
  • 要从旧对象创建新的不可变对象,必须创建一个新对象
  • 集合和字典也支持推导
  • 位运算可以用于集合上实现集合论操作(如并集、交集、对称差等)

序列类型的概念分组

  1. 容器/扁平序列

    • 容器序列:可以容纳不同类型的项目(如listtuplecollections.deque
    • 扁平序列:只能容纳一种类型的项目(如strbytesbytearraymemoryviewarray.array
  2. 可变/不可变序列

    • 可变序列:listbytearrayarray.arraycollections.dequememoryview
    • 不可变序列:tuplestrbytes

另一个很好的参考资料是《流畅的Python》, 作者:Luciano Ramalho


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接