Python 标准类型层次结构
目录
1 前言
这篇博客算是 The standard type hierarchy 的阅读笔记,配合原文阅读效果更佳。
2 None
NoneType 具有单个值。只有一个具有此值的对象。使用内置名称 None 来访问这个对象。
PS: return None is better than return.
3 NotImplemented
NotImplementedType 具有单个值。只有一个具有此值的对象。使用内置名称 NotImplemented 来访问这个对象。
如果数值方法和丰富的比较方法未实现所提供操作数的操作,则应返回此值。
PS: bool(NotImplemented) is True.
4 Ellipsis
ellipsis 具有单个值。只有一个具有此值的对象。使用 ... 或内置名称 Ellipsis 来访问这个对象。
对于这个对象的作用,可以看一下这篇博客: Python 的 Ellipsis 对象.
>>> Ellipsis is ... True
PS: ... 的写法只有 Python3 支持.
5 numbers.Number
numbers 是一个模块,详细内容可以浏览官方文档: numbers — Numeric abstract base classes.
numbers.Number 是所有 数值类型 的抽象基类,也就是说,对任意一个数字进行 isinstance(x, numbers.Number) 判断得到的结果都为 True.
>>> nums = [1, 2.3, complex(1, 2)] >>> all(map(lambda x: isinstance(x, numbers.Number), nums)) True
5.1 numbers.Integral
整数类型 的抽象基类,其子类包括 Integers(int) 和 Booleans(bool).
Booleans 类型只有两个值 True 和 False, 同时只存在两个对于的实例对象,通过内置名称 True 和 False 来访问这两个对象。
5.2 numbers.Real(float)
浮点数类型 的抽象基类。
5.3 numbers.Complex(complex)
复数类型 的抽象基类。
PS: 复数的字面值形式 1 + 2j.
5.4 relationship
抽象基类和实际的类之间的关系:
numbers.Number
+-- numbers.Complex
+-- complex
+-- numbers.Real
+-- float
+-- numbers.Rational
+-- numbers.Integral
+-- int
+-- bool
6 Sequences
抽象基类 Sequence 可以在 collections.abc — Abstract Base Classes for Containers 模块中找到。
内置函数 len 可以获得序列的长度,通过 seq[i] 的形式获取索引位置 i 处的元素值。
所有序列都支持 切片 操作: seq[i:j].
部分序列支持 扩展切片 操作: seq[i:j:k].
6.1 Immutable sequences
不可变序列类型的对象一旦创建就不能更改,以下类型是不可变序列:
- String
- 字符串类型 -
str - Tuples
- 元组类型 -
tuple - Bytes
- 字节字符串类型 -
bytes
6.2 Mutable sequences
可变序列在创建后可以更改,目前有两种内置的可变序列类型:
- Lists
- 列表类型 -
list - Byte Arrays
- 字节数组类型 -
bytearray
7 Set types
抽象基类 Set 可以在 collections.abc — Abstract Base Classes for Containers 模块中找到。
使用内置函数 len 可以获取 Set 的成员数量。
目前有两种固有的集合类型:
- Sets
- 可变集合类型 -
set - Frozen sets
- 不可变集合类型 -
frozenset()
PS: frozenset 可以用作 dict 的键,而 set 不可以。
8 Mappings
抽象基类 Mappings 可以在 collections.abc — Abstract Base Classes for Containers 模块中找到。
内置函数 len 可以用来获取映射中的成员数量。
目前有一种内置映射类型:
- Dictionaries
- 字典类型 -
dict
9 Callable types
抽象基类 Callable 可以在 collections.abc — Abstract Base Classes for Containers 模块中找到。
9.1 User-defined functions
用户定义的函数自然是可调用对象,同时也包含了一些特殊的属性:
| 属性 | 含义 | 读/写权限 |
|---|---|---|
__doc__ |
文档字符串 | 可读可写 |
__name__ |
函数名称 | 可读可写 |
__qualname__ |
函数的 qualified name |
可读可写 |
__module__ |
定义函数的模块的名称 | 可读可写 |
__defaults__ |
默认值参数元组 | 可读可写 |
__code__ |
表示已编译的函数体 | 可读可写 |
__globals__ |
对包含函数全局变量的字典的引用 | 只读 |
__dict__ |
函数属性 | 可读可写 |
__closure__ |
以包含 cell 的元组形式返回闭包所包含的自由变量 |
只读 |
__annotations__ |
包含参数注释的字典 | 可读可写 |
__kwdefaults__ |
包含强制关键字参数的默认值的字典 | 可读可写 |
这些属性的使用可以参考博客: Python 自定义函数的特殊属性(收藏专用)
9.2 Instance methods
实例方法具有用户自定义函数的大多数特殊属性,同时具有一些自己的 只读 特殊属性:
| 属性 | 含义 |
|---|---|
__self__ |
实例 |
__func__ |
函数对象 |
__doc__ |
same as __func__.__doc__ |
__name__ |
same as __func__.__name__ |
__module__ |
定义方法的模块的名称 |
实例方法的特殊属性可以参考博客: Python (类)实例方法的特殊属性
9.3 Other
- Generator functions
- 使用了
yield语句的函数为 生成器函数, 生成器的使用可以参考博客 Python 生成器. - Coroutine functions
- 使用
async def定义的函数或方法为Coroutine functions. - Asynchronous generator functions
- 使用
async def定义的 生成器函数 为Asynchronous generator functions, 可以得到双倍的快乐。 - Built-in functions
- 内置函数对象是
C函数的包装器,源码可见: bltinmodule.c. - Built-in methods
- 内置函数的另一种包装,隐式传递额外的参数。
- Classes
- 类对象是可调用的,创建实例的过程就是调用类对象的过程。
- Class Instances
- 在类对象中定义
__call__方法使得实例对象可调用。
10 Modules
模块对象由 import system 创建,对模块对象的属性引用被转换为该字典中的查找。
也就是说: m.x 等价于 m.__dict__["x"].
模块对象的一些可读可写的属性:
| 属性 | 含义 |
|---|---|
__name__ |
模块名 |
__doc__ |
模块文档字符串 |
__annotations__ |
模块正文执行期间收集的变量注释的字典 |
__file__ |
模块文件路径 |
特殊的只读属性: __dict__ 模块名称空间的字典对象。
11 Custom classes
自定义类也有一些特殊属性:
| 属性 | 含义 |
|---|---|
__name__ |
类名 |
__module__ |
定义类的模块名 |
__dict__ |
类名称空间字典 |
__bases__ |
基类元组 |
__doc__ |
类文档字符串 |
__annotations__ |
类变量注释字典 |
12 Class instances
实例对象的属性基本上都是由我们自己管理的了,至少我不希望自己创建的实例多出了什么奇怪的属性。
和实例相关的一个有用的东西: Python 魔法方法.
13 I/O objects
也称为 文件对象, 前段时间了解了一下 Python I/O 的封装层次,然后发现, Java 中也差不多。
基本的字节流,加上缓冲区的字节流,加上编码的带缓冲区的字节流。
14 Internal types
向用户公开的一些解释器内部使用的一些类型。
14.1 Code objects
Code 对象属于 不可变 对象,同时不包含任何可变对象的引用。
一些特殊的只读属性:
| 属性 | 含义 |
|---|---|
co_name |
函数名称 |
co_argcount |
位置参数的数量,包含具有默认值的参数 |
co_nlocals |
函数使用的局部变量数,包括参数 |
co_varnames |
局部变量名称的元组 |
co_cellvars |
嵌套函数引用的局部变量名称的元组 |
co_freevars |
自由变量名称的元组 |
co_code |
表示字节码指令序列的字符串 |
co_consts |
包含字节码使用的文字的元组 |
co_names |
包含字节码使用的名称的元组 |
co_filename |
编译代码的文件名 |
co_firstlineno |
函数的第一个行号 |
co_lnotab |
用于编码从字节码偏移到行号的映射的字符串 |
co_stacksize |
必需的堆栈大小 |
co_flags |
用于编码解释器的整数标志 |
14.2 Frame objects
帧对象表示执行帧。它们可能出现在回溯对象中,也会传递给已注册的跟踪函数。
帧对象的一些只读的特殊属性:
| 属性 | 含义 |
|---|---|
f_back |
前一个帧或 None |
f_code |
在此帧中执行的代码对象 |
f_locals |
用于查找局部变量的字典 |
f_globals |
用于全局变量 |
f_builtins |
用于内置名称 |
f_lasti |
代码对象的字节码字符串的索引 |
特殊的可写属性: f_trace, 如果不是 None, 则是在代码执行期间调用各种事件的函数(由调试器使用)。
可以通过将 f_trace_lines 设置为 False 来禁用此事件。
方法 frame.clear() 清除对帧所持有的局部变量的所有引用。
14.3 Other
- Traceback objects
- 回溯对象,表示异常的堆栈跟踪
- Slice objects
- 切片对象,可以通过内置函数
slice创建 - Static method objects
- 静态方法对象,可以由内置函数
staticmethod创建 - Class method objects
- 类方法对象,可以由内置函数
classmethod创建
15 结尾
我后悔了,搞这个花的时间有点长,收获与付出的时间成本不符。
后面部分不重要的内容也花费了过多的时间,前面有几篇博客也是这种情况……
以后需要注意一下了 QAQ