Python中使用双下划线防止类属性被覆盖问题


Posted in Python onJune 27, 2019

在使用Python编写面向对象的代码时,我们会常常使用“继承”这种开发方式。例如下面这一段代码:

class Info:
  def __init__(self):
    pass
  def calc_age(self):
    print('我是父类的方法')
class PeopleInfo(Info):
  def __init__(self):
    super().__init__()
  def calc_age(self):
    print(123456)

如果你使用 PeopleInfo 初始化一个对象,然后调用这个类的 calc_age 方法,我们来看看运行效果,如下图所示:

Python中使用双下划线防止类属性被覆盖问题 

可以看出,父类 Info 里面的 calc_age 被子类里面的 calc_age 给“覆盖”了。

到目前为止,应该都是你已经知道的东西。那么下一个问题,请问 PeopleInfo 里面的 __init__ 会不会覆盖 Info 里面的 __init__ ?

为了确认这一点,我们来测试一下:

class Info:
  def __init__(self):
    print('我是父类的__init__')
  def calc_age(self):
    print('我是父类的方法')
class PeopleInfo(Info):
  def __init__(self):
    super().__init__()
    print('我是之类的初始化方法')
  def calc_age(self):
    print(123456)

运行效果如下图所示:

Python中使用双下划线防止类属性被覆盖问题 

这里你发现父类和子类的 __init__ 都被运行了。

不过你可能会强行解释为:在子类的 __init__ 里面,有一行 super().__init__() ,这个地方可能子类还没有完全覆盖父类,所以先运行了父类的方法。等到子类的 __init__ 全部执行完成以后,才会覆盖父类。

当然,这种强行诡辩显然是错误的,但为了证明这里你看到的现象和这个 super().__init__() 没有任何关系,我们不使用 __init__ ,而是自己定义一个:

class Info:
  def __init__(self):
    pass
  def __calc_age(self):
    print('我是父类的方法')
  def run_father(self):
    self.__calc_age()
class PeopleInfo(Info):
  def __init__(self):
    super().__init__()
    pass
  def __calc_age(self):
    print(123456)
  def run_son(self):
    self.__calc_age()

运行效果如下图所示:

Python中使用双下划线防止类属性被覆盖问题 

从这里可以看出,父类和子类的 __calc_age 都成功运行了。

这是因为,在Python里面,类方法或者属性如果以双下划线开头,那么他们就是类的私有方法,在被继承的时候,即使子类有相同名字的以双下划线开头的属性或者方法也不会覆盖父类。

而且这些以双下划线开头的私有方法或者属性,在类内部可以自由被其他方法调用,但是在实例对象里面是不能直接调用的,如下图所示:

Python中使用双下划线防止类属性被覆盖问题 

那么Python是如何实现这一点的呢?实际上Python仅仅是改了一个名字而已。我们使用 dir 函数看看实例对象 kingname 里面有哪些内容,如下图所示:

Python中使用双下划线防止类属性被覆盖问题 

大家请注意方框框住的内容,其中的 _Info__calc_age 就是父类中的 __calc_age ,而 _PeopleInfo__calc_age 就是子类中的 __calc_age 。Python仅仅是改了一个名字,在这种双下划线的私有方法或者私有属性的前面加上了 _类名 ,这样就确保了子类和父类的方法名不一致。

所以,虽然 在规范上,这种双下划线的私有方法和私有属性是不应该在外部访问的 ,但是如果你想强行访问,可以个使用这种改名以后的名字:

kingname = PeopleInfo()
kingname._PeopleInfo__calc_age() # 强行调用子类的私有方法
kingname._Info__calc_age() # 强行调用父类的私有方法

运行效果如下图所示:

Python中使用双下划线防止类属性被覆盖问题 

总结

以上所述是小编给大家介绍的Python中使用双下划线防止类属性被覆盖问题,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Python 相关文章推荐
使用python提取html文件中的特定数据的实现代码
Mar 24 Python
Python 异常处理实例详解
Mar 12 Python
python简单实现基数排序算法
May 16 Python
Python中super函数的用法
Nov 17 Python
Python实现的knn算法示例
Jun 14 Python
python根据url地址下载小文件的实例
Dec 18 Python
Python脚本修改阿里云的访问控制列表的方法
Mar 08 Python
在PYQT5中QscrollArea(滚动条)的使用方法
Jun 14 Python
用python打印菱形的实操方法和代码
Jun 25 Python
Django路由层如何获取正确的url
Jul 15 Python
Python干货实战之八音符酱小游戏全过程详解
Oct 24 Python
python编程学习使用管道Pipe编写优化代码
Nov 20 Python
PyTorch的深度学习入门教程之构建神经网络
Jun 27 #Python
PyTorch的深度学习入门之PyTorch安装和配置
Jun 27 #Python
解决pycharm remote deployment 配置的问题
Jun 27 #Python
python turtle库画一个方格和圆实例
Jun 27 #Python
Python实现的对一个数进行因式分解操作示例
Jun 27 #Python
python pytest进阶之xunit fixture详解
Jun 27 #Python
Python批量查询关键词微信指数实例方法
Jun 27 #Python
You might like
分享php邮件管理器源码
2016/01/06 PHP
PHP计算当前坐标3公里内4个角落的最大最小经纬度实例
2016/02/26 PHP
[原创]解决wincache不支持64位PHP5.5/5.6的问题(提供64位wincache下载)
2016/06/22 PHP
Yii中CGridView禁止列排序的设置方法
2016/07/12 PHP
laravel 使用auth编写登录的方法
2019/09/30 PHP
翻译整理的jQuery使用查询手册
2007/03/07 Javascript
论坛里点击别人帖子下面的回复,回复标题变成“回复 24# 的帖子”
2009/06/14 Javascript
jQuery回车实现登录简单实现
2013/08/20 Javascript
jQuery插件expander实现图片翻转特效
2015/05/21 Javascript
jQuery实现平滑滚动的标签分栏切换效果
2015/08/28 Javascript
js HTML5 Ajax实现文件上传进度条功能
2016/02/13 Javascript
nodejs修复ipa处理过的png图片
2016/02/17 NodeJs
JavaScript+Java实现HTML页面转为PDF文件保存的方法
2016/05/30 Javascript
JavaScript_ECMA5数组新特性详解
2016/06/12 Javascript
Jquery组件easyUi实现手风琴(折叠面板)示例
2016/08/23 Javascript
Node.js下自定义错误类型详解
2016/10/17 Javascript
Javascript中构造函数要注意的一些坑
2017/01/23 Javascript
bootstrap vue.js实现tab效果
2017/02/07 Javascript
JavaScript中最常见的三个面试题解析
2017/03/04 Javascript
基于jQuery Easyui实现登陆框界面
2017/07/10 jQuery
react开发教程之React 组件之间的通信方式
2017/08/12 Javascript
vue.js实现的经典计算器/科学计算器功能示例
2018/07/11 Javascript
node.js使用express框架进行文件上传详解
2019/03/03 Javascript
vue中filters 传入两个参数 / 使用两个filters的实现方法
2019/07/15 Javascript
安装Python的web.py框架并从hello world开始编程
2015/04/25 Python
在python中做正态性检验示例
2019/12/09 Python
Python内置方法实现字符串的秘钥加解密(推荐)
2019/12/09 Python
浅析pip安装第三方库及pycharm中导入第三方库的问题
2020/03/10 Python
Python大批量搜索引擎图像爬虫工具详解
2020/11/16 Python
求职推荐信
2013/10/28 职场文书
九年级家长会邀请函
2014/01/15 职场文书
倡议书范文
2014/04/16 职场文书
篮球比赛拉拉队口号
2014/06/10 职场文书
2014年村委会工作总结
2014/11/24 职场文书
黄石寨导游词
2015/02/05 职场文书
Debian11 Xfce终端光标的颜色怎么设置?
2022/08/14 数码科技