为什么Python必须在方法定义和调用中显示使用“self”?

这个想法借鉴了 Modula-3 语言。出于多种原因它被证明是非常有用的。

首先,更明显的显示出,使用的是方法或实例属性而不是局部变量。

阅读 self.x 或 self.meth() 可以清楚地表明,即使您不知道类的定义,也会使用实例变量或方法。

在 C++ 中,可以通过缺少局部变量声明来判断(假设全局变量很少见或容易识别) —— 但是在 Python 中没有局部变量声明,所以必须查找类定义才能确定。

一些 C++ 和 Java 编码标准要求实例属性具有 m_ 前缀,因此这种显式性在这些语言中仍然有用。

其次,这意味着如果要显式引用或从特定类调用该方法,不需要特殊语法。

在 C++ 中,如果你想使用在派生类中重写基类中的方法,你必须使用 :: 运算符 -- 在 Python 中你可以编写 baseclass.methodname(self, )。

这对于 __init__() 方法非常有用,特别是在派生类方法想要扩展同名的基类方法,而必须以某种方式调用基类方法时。

最后,它解决了变量赋值的语法问题:

为了 Python 中的局部变量(根据定义!)在函数体中赋值的那些变量(并且没有明确声明为全局)赋值,就必须以某种方式告诉解释器一个赋值是为了分配一个实例变量而不是一个局部变量,它最好是通过语法实现的(出于效率原因)。

C++ 通过声明来做到这一点,但是 Python 没有声明,仅仅为了这个目的而引入它们会很可惜。

使用显式的 self.var 很好地解决了这个问题。类似地,对于使用实例变量,必须编写 self.var 意味着对方法内部的非限定名称的引用不必搜索实例的目录。

换句话说,局部变量和实例变量存在于两个不同的命名空间中,您需要告诉 Python 使用哪个命名空间。

更多Python问答知识,请关注Python视频教程!!

python定义方法self会被当作变量_为什么Python必须在方法定义和调用中显式使用“self”?...相关推荐

  1. python 定义变量_用python解决动态的定义变量名(并给其赋值方法:大数据处理)...

    前言: 今天为大家带来的内容是:用python解决动态的定义变量名(并给其赋值方法:大数据处理)具有很好的参考价值,希望对大家有所帮助.喜欢本文内容的记得点赞转发收藏不迷路哦!!! 最近消费kafka ...

  2. python 定义字典键为变量_在python字典中使用变量作为键名

    我今天来是因为我有同样的问题.我必须说,我对这些答案很失望!我同意你的观点,这种冗余应该有一个惯用的解决方案.在这种情况下,JavaScript似乎比Python更明智.所以我想增加两个建议. 首先, ...

  3. python定义构造函数、包括颜色价格品牌_《Python编程与算法基础教程》(第二版),蒋洪宇,青松,第9章:课后练习,程序设计,版江红余,第九章,习题,答案...

    例9.1~例9.53 补充: 类名为有效的标识符,一般为多个单词组成的名称,每个单词除第一个字母大写外,其余的字母均小写 一:类对象和实例对象 例9.1(创建类对象和实例对象) >>> ...

  4. python打印多个变量_在Python中打印多个变量

    python打印多个变量 Like other programming languages, In python also, we can define and print the multiple ...

  5. python的四种内置数字类型_浅析Python数字类型和字符串类型的内置方法

    一.数字类型内置方法 1.1 整型的内置方法 作用 描述年龄.号码.id号 定义方式 x = 10 x = int('10') x = int(10.1) x = int('10.1') # 报错 内 ...

  6. python 打印数组变量_使用Python将数组的元素导出到变量中(unpacking)

    下面就为大家分享一篇使用Python将数组的元素导出到变量中(unpacking),具有很好的参考价值,希望对大家有所帮助.一起过来看看吧 最近工作中遇到一个问题,需要利用Python将数组(list ...

  7. python文件读取方法read(size)的含义是_在Python中可使用read([size])来读取文件中的数据,如果参数size省略,则读取文件中的()。(4.0分)_学小易找答案...

    [单选题]文本文件存储的是(),由若干文本行组成,通常每行以换行符 '\n' 结尾.(4.0分) [单选题]()属性是返回被打开文件的访问模式.(4.0分) [单选题]重力坝是由砼或( )修筑而成的大 ...

  8. python中init方法的两个下划线_为什么Python中有各种各样的“_”下划线?分别有什么用?...

    刚开始学Python的你一定很疑惑,为什么Python里会出现各种各样的下划线 "_",而且位置都不相同,有时候在名称后面,有时候在前面,有时候还会在数字中间......这些下划线 ...

  9. 关于python变量_关于python变量练习题

    第一题(数字相加) age=20 new_age=age+1 print(new_age) 第二题(字符串相加) name='xiu' new_name=name+'hb' print(new_nam ...

最新文章

  1. mybatis 分页需要的jar包下载_牛逼哄哄的PageHelper分页插件到底牛在哪里?
  2. 缺省的servlet(了解)
  3. 7天学会python_7天学会Python最佳可视化工具Seaborn(五):结构化展示多维数据
  4. 6月24 面向对象的设计原则-----工厂模式和单列模式
  5. Esxi 6.5u2升级Esxi 6.7
  6. proxychains-ng 工作原理分析
  7. Firefox 和 Chrome 性能测试对比
  8. 排序算法java 简书_手撕算法---常见排序算法java实现
  9. [USACO14OPEN]Odometer【数位DP】
  10. 使用bootstrap画登录页面并实现表单校验与“记住我”功能
  11. 整理了上千个Python类库,简直太酷啦!
  12. 免费的中文深度学习全书:《深度学习理论与实战:提高篇》
  13. 分享微信使用技巧,快来涨姿势啦
  14. (转)什么是BD,怎么做一个好BD
  15. fi sap 凭证冲销 稅_SAP FI 系列 (019) - 会计凭证的冲销和反记账
  16. js当前日期倒推,向前倒推或往后推算
  17. 数据项组成数据元素,数据元素组成数据
  18. 【精】iOS知识树,知识点(包括对象、Block、消息转发、GCD、运行时、runloop、动画、Push、KVO、tableview,UIViewController、提交AppStore)
  19. android 各个存储、储存路径及获取方法总结
  20. GooglePlay 发布问题汇总

热门文章

  1. SNF软件开发机器人-子系统-功能-【列表】自由排序-如何配置?
  2. javascript 面向对象编程(工厂模式、构造函数模式、原型模式)
  3. 01-复杂度3 二分查找
  4. 监听Activity的生命周期的方式。
  5. 按字符串长度切割字符串(支持汉字占2个长度)
  6. SSL协议、HTTP和HTTPS和区别
  7. Java Struts2 (一)
  8. MySQL查询表内重复记录
  9. Linux sar分析网卡流量
  10. BadgeView(View上添加提醒)的应用与分析