手写 Python 虚拟机
海纳
华为资深编译专家,原 Huawei JDK 团队负责人
1213 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已更新 23 讲/共 28 讲
导学|直播加餐:三小时掌握C++ (3讲)
手写 Python 虚拟机
15
15
1.0x
00:00/00:00
登录|注册

19|自定义类型:面向对象编程的基础设施

你好,我是海纳。
在 Python 中,包括函数、方法、类型在内的一切皆是对象,我们前面已经很深刻地认识到了这一点。这些机制为面向对象编程提供了基础。上一节课,我们为虚拟机添加了类型系统。这节课,我们会在上节课的基础上,继续研究如何实现用户自定义类型。
自定义类的实现可能是 Python 3 相对于 Python 2 变化最大的一个特性了。它新增了很多机制,使类的功能变得更加强大、灵活了。但同时,这些新的特性也给开发者设置了不小的门槛,尤其是元类(metaclass),很多人即使可以合理地使用它来进行开发,但仍然很难说出它背后的原理。
这一节课,我们就一步步地来实现自定义类的这些功能。

支持用户自定义类型

Python 是一种支持对象的编程语言,而面向对象的编程语言中,最重要的一个特性就是自定义类。我们经过了长途跋涉,终于走到自定义类的门口了。和之前一样,我们先来研究测试用例以及它的字节码。
class A(object):
value = 1
a = A()
print(a.value)
对应的字节码:
1 0 LOAD_BUILD_CLASS
2 LOAD_CONST 0 (<code object A>)
4 LOAD_CONST 1 ('A')
6 MAKE_FUNCTION 0
8 LOAD_CONST 1 ('A')
10 LOAD_NAME 0 (object)
12 CALL_FUNCTION 3
14 STORE_NAME 1 (A)
4 16 LOAD_NAME 1 (A)
18 CALL_FUNCTION 0
20 STORE_NAME 2 (a)
5 22 LOAD_NAME 3 (print)
24 LOAD_NAME 2 (a)
26 LOAD_ATTR 4 (value)
28 CALL_FUNCTION 1
30 POP_TOP
32 LOAD_CONST 2 (None)
34 RETURN_VALUE
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

1. Python 3 中新增了很多机制,使自定义类的功能变得更加强大、灵活,但也给开发者设置了不小的门槛,尤其是元类(metaclass)的使用。 2. Python 3 中的创建类型对象的核心逻辑位于 `__build_class__` 和 exec 两个函数中。 3. `__build_class__` 函数的作用是创建类型对象,它接受的参数有 5 个,包括 func、name、bases、metaclass 和 kwds。 4. 虚拟机通过执行 `__build_class__` 函数得到创建对象类型所需要的字典,然后通过调用 internal_exec 方法来创建类型对象。 5. 类的属性由第一个参数 func 来构造,func 所对应的 CodeObject 正是类型 A 的 CodeObject,在这段代码里,初始化了全量名、模块名、所有的方法和类属性。 6. Python 3 中的 exec 函数可以执行给定的源代码,并在全局和局部上下文中执行。 7. 虚拟机通过调用 Python 代码的时候,使用 call_virtual 方法进行跨语言调用。 8. 创建自定义类型的 TypeObject 对象是主要目标之一,通过 `__build_class__` 函数和 exec 方法实现了创建自定义类型的功能。 9. 通过 `__build_class__` 函数和 exec 方法,成功创建了一个自定义类型的类型对象,也就是它的对应的 TypeObject。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手写 Python 虚拟机》
新⼈⾸单¥59
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部