美文网首页
为什么Python类成员的调用和声明必须有"this"?

为什么Python类成员的调用和声明必须有"this"?

作者: 那个小码哥 | 来源:发表于2017-03-13 11:06 被阅读0次

Python的这种设计是作者从Modula-3中借鉴来的,在后面使用的情况看来,这个设计也是比较成功的。我们对比Python和C++讨论一下这个问题:

Modula-3是上世纪80年代末数字设备公司(DEC)系统研究中心(SRC)和Olivetti研究中心(ORC)设计的一门语言。尽管这门语言没有在业界广泛的应用起来,但这么语言对后面被发明的Java, Python, Caml, C# 都产生了很多的影响

首先,调用的时候要求指定"this",让我们更明确的区分调用的是一个成员变量、函数或者是一个局部变量、函数。当我们读到self.x或者self.meth(),即使我们不知道class的定义也能100%确定这里调用的是一个成员变量或者方法。我们设想一下,在C++中,我们还可以通过查看并排除所有的局部变量的方式去确认变量是成员变量(假设全局变量很少见,即使出现也是"g_"这种很容易辨认的)。而在Python中,由于变量不需要额外的定义,这个办法就失效了,唯一的办法就只有看class的定义,所以this就成了必须的。 很多C++和Java的编码规范中会规定成员函数或变量要有m_前缀,我们也可以看到这种编码规范是十分必要的。

其次,由于this这个对当前实例的强制显式引用,Python不需要引入任何新的语法就可以引用或者调用其它类(包括父类)的成员变量和函数。在C++中,如果我们想要在子类中调用父类的函数,我们需要用到::这个运算符;在Python中我们这么写baseclass.methodname(self, <argument list>)。Python的这种语法在实现子类的init()时特别有用,例如我们经常需要在子类中override父类的函数并且调用父类函数自身。

最后,就是性能上的些许考量:在Python的语言定义中,局部变量就是在函数体中赋值,并且没有在全局显式的声明过的变量。当然在语言设计上,我们有很多的办法去告诉解释器、编译器某个变量赋值是针对一个局部变量还是一个成员变量,但出于解释性语言的性能考虑,最好是语义上的的规定。C++用变量必须显示的声明解决了这个问题,但Python没有额外的变量声明语法,如果仅仅是出于上面所说的目的引入类似C++的变量必须显式的声明就显得太得不偿失了。所以,self.var这种语法就是一个非常优美的解决方案。我们在函数里写上self.var这种语法,解释器就不用费力地在全局范围内进行变量的查找。换句话说,局部变量和成员变量存在于两个不同的命名空间,我们需要告诉Python我们用的是哪个空间。

相关文章

  • 为什么Python类成员的调用和声明必须有"this"?

    Python的这种设计是作者从Modula-3中借鉴来的,在后面使用的情况看来,这个设计也是比较成功的。我们对比P...

  • Java编程基础(15)

    Java成员方法:Java成员方法的声明和调用、形参和实参及局部变量 声明成员方法可以定义类的行为,行为表示一个对...

  • C++ 构造函数的调用顺序是什么

    先调用基类构造函数 按声明顺序初始化数据成员 最后调用自己的构造函数

  • OC:成员变量、方法

    目录 成员变量 方法的声明和实现 方法的调用 成员变量 注:本文演示的Demo,是基于《OC学习备忘录:类的定义》...

  • 10.24学习总结

    今天代课老师讲了第五章结构(结构的声明,结构成员,结构调用,结构和类的区别),枚举(枚举的声明和使用,关联...

  • 给深度学习入门者的Python快速教程 - 基础篇 - 笔记

    标签: 读书笔记 python 深度学习 原文链接 1. Class 类的基本声明和成员 类的继承 2. 函数式编...

  • C++继承

    继承访问权限 先看继承的权限关键字,再看父类的成员变量声明关键字。 构造函数执行顺序 调用父类构造方法 调用组合类...

  • 函数声明及其用法

    函数声明: 例子:声明一个函数 传统方法调用函数: 调用成员函数: 注意:成员函数调用通过点表示法 函数参数: 具...

  • C++中成员函数的声明与调用

    成员函数的语法有点让人困惑,记录在此。如下的一个类,有两个成员函数,形参相同: 成员函数的声明: 调用: 输出: ...

  • java的语言基础

    1代码注释 文档注释.类的声明,类的成员变量声明,类的成员方法声明 4 多行注释/* */ //在控制台上...

网友评论

      本文标题:为什么Python类成员的调用和声明必须有"this"?

      本文链接:https://www.haomeiwen.com/subject/rnsfnttx.html