09|函数对象 :函数是依赖什么成为第一类公民的?
海纳
你好,我是海纳。
上一节课我们介绍了函数的静态代码和动态记录之间的区别,以及通过递归函数的执行过程,深入介绍了栈帧的组织结构,这一节课我们就通过编写代码实现相应的功能。
在 Python 中,函数(function)和方法(method)的意义是不同的。类中定义的成员函数被称为方法,不在类中定义的函数才是我们平常所说的狭义的函数。方法是建立在类机制上的,所以函数比方法要简单一些,这节课我们就从函数开始实现。
实现函数功能
我们先从一个最简单的例子开始,定义一个函数,让它打印一个字符串。
将这段代码存为一个文件,名为 func.py,然后使用 python -m compileall func.py 命令,把这个文件编译成 func.pyc 文件。再使用 show_file.py 工具,查看 func.pyc 文件的构造。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
1. Python 中函数(function)和方法(method)的意义不同,方法是建立在类机制上的,函数比方法要简单一些。 2. 实现函数功能时,需要关注字节码的构造和实现 MAKE_FUNCTION 和 CALL_FUNCTION 这两个字节码。 3. 在虚拟机执行器中,需要实现 FrameObject 数据结构来记录函数的调用过程,每次函数调用都会创建一个 FrameObject,每次函数执行结束,相应的 FrameObject 也会被销毁。 4. FrameObject 对一些状态变量进行封装,包括代码执行时的 pc、locals 等变量。 5. Interpreter 的 run 方法需要修改,将相关变量转移到 FrameObject 中,如 stack 等. 6. 创建 FunctionObject 有了代表栈帧的 FrameObject 和代表代码的 CodeObject,分别用于描述动态的活动记录和静态的代码信息,对于普通的编程语言就已经够了。 7. FunctionObject 是一个真正的虚拟机对象,可以被变量引用,也可以被添加到列表中,所有可以对普通对象进行的操作,都可以施加到 FunctionObject 上。 8. 一个 CodeObject 可以对应多个 FunctionObject。 9. MAKE_FUNCTION 的实现通过 CodeObject 创建一个 FunctionObject.
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手写 Python 虚拟机》,新⼈⾸单¥59
《手写 Python 虚拟机》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论