ad

《自己动手写 Python 虚拟机》_更理解虚拟机的意义_6.4 方法

网友投稿 138 2023-11-07

【摘要】 本书摘自《自己动手写 Python 虚拟机》一书中第6章,第4节,海纳编著。

6.4 方法

《自己动手写 Python 虚拟机》_更理解虚拟机的意义_6.4 方法

我们使用函数和方法这两个名词来区分一个函数是否与类绑定。在C+ 这种 面向对象编程语言中,如果一个函数不与类相关,在类的外部独立定义,就会被称为 函数。如果一个函数在类中定义,只有通过类的实例才能调用,这种函数就被称为方 法。在本书中,我们严格区分函数和方法。例如下面的两个例子,代码如下:

def foo():

2 print"hello"

3

4 class A(object):

5 def func(self):

6 print self

7 print"world"

8

9 a =A()

10 a.func()

foo 不和任何对象相联系,独立定义它就是一个函数,而 func 则必须通过 A 的 实例a 进行调用,而且a 还会作为实参传入到 func 中去,也就是说,第一个参数 self 实际上就是对象a 。通过这两个例子的对比,我们就知道函数和方法的区别了。由 于虚拟机现在还不能支持class 语句定义类,所以读者可以使用标准 Python 虚拟机 来执行这个例子,以便观察这个例子的执行结果。

·在前边的两节实现的都是函数,在这一节,我们尝试实现方法。和以前一样,还 是从最简单的例子开始。例如,Python 中的 String 类型,定了一个方法 upper, 它的 作用是返回一个新的字符串,新字符串中的所有字母都变成大写的。通过以下例子 来观察 upper 方法的效果,如代码清单6.20所示。

s ="hello"

2 t=s.upper()

3

4 print s

5 print t

使用 Python 运行这个例子,结果会是hello 和 HELLO, 这说明对字符串s 调用 upper 方法,并不会改变 s 的内容,而是会返回一个新的字符串。再来看这一段代码 所对应的字节码是什么,代码如下:

这段字节码里,可以说大部分都是老朋友了。唯一一个还没有实现的字节码就

是LOAD_ATTR 。LOAD_ATTR 是一个带有参数的字节码,它的参数是一个整 数,这是一个 names表中的序号。这代表 LOAD_ATTR 的真实参数其实是方法名 upper。在LOAD_ATTR 之前,已经通过LOAD_NAME 把字符串s 加载到栈顶了。 而LOAD_ATTR 是一个需要两个操作数的字节码, 一个是调用方法的目标对象,另 一个是方法的名称。目标对象通过预先加载到操作数栈来提供,方法的名称则通过 names 表的序号,以字节码参数的形式提供。

实际上,LOAD_ATTR 是 load attribute 的缩写,它的本意是访问某个对象里的 属性,在 Python 中,方法也是一个普通的对象,也可以当成对象的属性进行处理,所 以,不论是访问对象中的某个域(field), 还是访问它的某个方法,都可以使用 LOAD ATTR 这条字节码。

由于upper 是 String 类型的一个方法,我们自然会想到在代表 String 类的 StringKlass 中增加这个方法。其实,不仅仅是 StringKlass 中会增加新的方法,其他 所有类型的Klass 都有定义新的方法,例如列表对象的append 方法,字典对象的 up- date 方法等。因此,可以在 Klass 中引入一个 Map, 专门用于记录某一种类型上的所 有属性和方法,代码如下:

class Klass {

2 private:

3

4 HiDict* _klass_dict;

5

6 public:

7

8 void set_klass_dict(HiDict*dict) {_klass_dict =dict;}

9 HiDict*klass_dict() {return_klass_dict;}

10

11 );

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 18664393530@aliyun.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:《自己动手写 Python 虚拟机》_更理解虚拟机的意义_6.2.2 函数的参数
下一篇:《Python+3自动化软件发布系统》Django 2实战_了解Python的更好方法_2.6.5 UrlConf 的命名空间
相关文章

 发表评论

暂时没有评论,来抢沙发吧~

×