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

20|创建对象:支持对象创建和访问属性以完成基本对象系统

你好,我是海纳。
上一节课,我们通过 class 关键字定义了类型对象。同时,第 18 课也讲过可以通过 list、dict、str 等类型对象来创建实例。自定义类型对象也应该与内建类型对象具有同样的功能,开发者应该可以像函数一样调用类型对象,创建类型实例。
这一节课,我们就来实现这个功能。

通过自定义类型创建实例

下面这个例子展示了如何像函数一样调用类型对象来创建对应的实例。
class A(object):
value = 1
a = A()
print(a.value)
这个字节码和之前通过 list、int 等创建实例时的字节码是相同的,都是生成了 CALL_FUNCTION 指令,这里我就不再重复了。
ListKlass 里已经实现了 allocate_instance 方法,用来创建新的列表对象。和它差不多,我们也可以在 Klass 中实现这个方法,从而让普通的自定义类型对象也可以创建实例。你可以看一下对应的代码。
HiObject* Klass::allocate_instance(HiList* args) {
HiObject* inst = new HiObject();
inst->set_klass(this);
return inst;
}
Klass 在创建实例的时候,只要把实例对象的 klass 指针指向自己就完成了最简单的创建对象功能。增加了这个方法以后,刚刚那个例子就能正确执行了。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

1. Type对象在Python中可以被调用来定义新的类型,接受三个参数用于定义新类型。 2. TypeKlass的call方法处理type对象的调用,根据参数个数决定调用何种函数进行处理,可以创建新的类型。 3. Klass类的allocate_instance方法用于创建对象,并在创建对象后检查类型是否定义了`__init__`方法,如果定义了,则需要进一步调用这个方法来初始化对象。 4. 特殊函数和操作符重载可以通过在类型里定义特殊函数来实现,比如通过添加`__add__`方法让Python对象支持加法运算。 5. 操作符重载可以让自定义类型的加法运算表现得像普通整数,通过BINARY_ADD指令,虚拟机的真实动作是把对象b作为参数,调用对象a的`__add__`方法。 6. 使用宏来代替某些字符输入,虽然可以减少简单代码的输入,但在C++编程中尽量不要使用宏,因为宏带来的问题难以调试。

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

精选留言

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