08 2020 档案
摘要:楔子 这次我们来看一下Python中类的继承与属性查找机制,我们说Python是支持类的多继承的,在查找属性的时候会沿着继承链不断找下去。那么下面我们就来深入地考察一下类的继承与属性查找在底层是如何实现的。 深入class 我们知道Python里面有很多以双下划线开头、双下划线结尾的方法,我们称之为
阅读全文
摘要:楔子 这一次我们就来看看Python中类是怎么实现的,我们知道C不是一个面向对象语言,而Python却是一个面向对象的语言,那么在Python的底层,是如何使用C来支持Python实现面向对象的功能呢?带着这些疑问,我们下面开始剖析python中类的实现机制。另外,在Python2中存在着经典类(c
阅读全文
摘要:楔子 上一篇我们看了函数是如何调用的,这一次我们看一下函数中局部变量的访问、以及闭包相关的知识。 函数中局部变量的访问 我们说过函数的参数和函数内部定义的变量都属于局部变量,所以它也一样是通过静态的方式进行访问。 x = 123 def foo(): global x a = 1 b = 2 # a
阅读全文
摘要:楔子 在上一篇博客中,我们说了Python函数的底层实现,并且还演示了如何自定义一个函数,虽然这在工作中没有太大意义,但是可以让我们深刻理解函数的行为。此外我们还介绍了如何获取函数的参数,而这一次我们就来看看函数如何调用的。 函数的调用 s = """ def foo(): a, b = 1, 2
阅读全文
摘要:楔子 函数是任何一门编程语言都具备的基本元素,它可以将多个动作组合起来,一个函数代表了一系列的动作。当然我们之前说函数也是一个变量,该变量指向一个函数。而且在调用函数时会干什么来着,没错,要在运行时栈中创建栈帧,用于函数的执行。 那么下面就来看看函数在C中是如何实现的,生得一副什么模样。 PyFun
阅读全文
摘要:楔子 在上一章中,我们介绍了Python虚拟机中常见的字节码指令。但我们的流程都是从上往下顺序执行的,在执行的过程中没有任何变化,但是显然这是不够的,因为怎么能没有流程控制呢。下面我们来看看Python所提供的流程控制手段,其中也包括异常检测机制。 Python虚拟机中的if控制流 if字节码 if
阅读全文
摘要:楔子 上一章中,我们通过_PyEval_EvalFrameDefault看到了Python虚拟机的整体框架,那么这一章我们将深入到_PyEval_EvalFrameDefault的各个细节当中,深入剖析Python的虚拟机,在本章中我们将剖析Python虚拟机是如何完成对一般表达式的执行的。这里的一
阅读全文
摘要:楔子 这一次我们就来剖析Python运行字节码的原理,我们知道Python虚拟机是Python的核心,在源代码被编译成PyCodeObject对象时,就将由Python虚拟机接手整个工作。Python虚拟机会从PyCodeObject中读取字节码,并在当前的上下文中执行,直到所有的字节码都被执行完毕
阅读全文
摘要:楔子 当我们想要执行一个py文件的时候,只需要python xxx.py即可,但是你有没有想过这背后的流程是怎么样的呢?从这里开始我们就开始进入到Python虚拟机的环节了,之前都是在介绍Python中的一些内置对象,不过虚拟机的执行流程、以及背后的原理却更是值得我们关注的。 这里我们先来说一下Py
阅读全文
摘要:楔子 Python的字典是一种映射型容器对象,保存了键(key)到值(value)的映射关系。通过字典,我们可以快速的实现值的查找,json这种数据结构也是借鉴了Python中的字典。而且字典在Python中是经过高度优化的,因为Python底层也在大量的使用字典这种数据结构。 那么这次我们就来全面
阅读全文
摘要:楔子 Python中的列表可以说使用的非常广泛了,在初学列表的时候,老师会告诉你列表就是一个大仓库,什么都可以存放。不过在最开始的几个章节中,我们花了很大的笔墨介绍了Python中的对象,并明白了Python中变量的本质,我们知道列表中存放的元素其实都是泛型指针PyObject *,所以到现在列表已
阅读全文
摘要:楔子 这一次我们分析一下Python中的字符串,首先Python中的字符串是一个变长对象,因为不同长度的字符串所占的内存空间是不一样的;但同时字符串又是一个不可变对象,因为一旦创建就不可以再修改了。 而Python中的字符串是通过unicode来表示的,因此在底层对应的结构体是PyUnicodeOb
阅读全文
摘要:楔子 不少编程语言中的"字符串"都是使用字符数组(或者称字符序列)来表示,比如C语言和go语言就是这样。 char name[] = "komeiji satori"; 一个字节最多能表示256个字符,所以对于英文来说足够了,因此一个英文字符占一个字节即可,然而对于那些非英文字符便力不从心了。因此为
阅读全文
摘要:楔子 这次我们来分析一下Python中的整数是如何实现的,我们知道Python中的整数是不会溢出的,换句话说,它可以计算无穷大的数。只要你的内存足够,它就能计算,但是对于C来说显然是不行的,可Python底层又是C实现的,那么它是怎么做到整数不会溢出的呢? 既然想知道答案,那么看一下Python中的
阅读全文
摘要:楔子 从现在开始,我们就来分析Python中常见的内置对象、以及对应的实例对象,看看它们在底层是如何实现的。但说实话,我们在前面几节中介绍对象的时候,已经说了不少了,不过从现在开始要进行更深入的分析。 除了对象本身,还要看对象支持的操作在底层是如何实现的。我们首先以浮点数为例,因为它是最简单的,没错
阅读全文