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

2024-05-01 22:28:48 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我正在使用Python 3.8。{a1}和{a2}文档非常简洁,它将帮助我了解python中针对不同类型存在的不同协议的高级概述(我已经“了解”(阅读了?),例如,要实现一个“类似于不可变的”对象,必须遵循python中的{},这意味着必须实现{}和{}“可变类”,您必须进一步添加__setitem____delitem__

我没有看到python文档中使用的“protocol”一词,最贴切的描述似乎来自collections abstract base classes模块。但是,作为一个新手,我不确定collections.abc是否完全是其他的东西,或者这里提供的信息是否适用于python内置类型(即listtupledict等等;特别是因为collections.abc文档声明它“提供了Python的通用内置容器、dict、list、set和tuple的替代方案”,第二,因为如果我想从Python语言本身了解默认内置内容,我不想去collections模块)

有人有可靠的资源吗?如果信息是一种继承关系格式,这样信息就不会被重复,这会很有帮助。例如,在我上面的例子中,与其说一个mutable-like对象实现了__len____getitem____setitem____delitem__,不如说我的弱小的大脑更容易控制它。”“chunked”和信息类似于“一个mutable-like对象继承自immutable-like并添加__setitem____delitem__

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


Tags: 模块对象方法文档信息类型内置collections
1条回答
网友
1楼 · 发布于 2024-05-01 22:28:48

the glossary建很多房子,这是我目前能做的最好的了。我希望这个问题能被其他人的多个答案所扩展

定义

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

类型

  • 可排序/可比较:实现__eq__()__lt__()__le__()__gt__()__ge__()。对于包含检查(即与in一起使用),实现__contains__()或是Iterable
  • 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. 容器/平面序列

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

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

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

相关问题 更多 >