UP | HOME

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 类型只有两个值 TrueFalse, 同时只存在两个对于的实例对象,通过内置名称 TrueFalse 来访问这两个对象。

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

版权声明:本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可