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的净值数据接口调用示例分享
Mar 15 Python
Python数据类型详解(一)字符串
May 08 Python
Python正确重载运算符的方法示例详解
Aug 27 Python
利用Python-iGraph如何绘制贴吧/微博的好友关系图详解
Nov 02 Python
Python线程之定位与销毁的实现
Feb 17 Python
python创建学生成绩管理系统
Nov 22 Python
使用python图形模块turtle库绘制樱花、玫瑰、圣诞树代码实例
Mar 16 Python
keras处理欠拟合和过拟合的实例讲解
May 25 Python
sklearn和keras的数据切分与交叉验证的实例详解
Jun 19 Python
django restframework serializer 增加自定义字段操作
Jul 15 Python
Pytorch之Tensor和Numpy之间的转换的实现方法
Sep 03 Python
python切割图片的示例
Nov 12 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
怎样辨别一杯好咖啡
2021/03/03 新手入门
PHP mcrypt可逆加密算法分析
2011/07/19 PHP
php对图像的各种处理函数代码小结
2013/07/08 PHP
Javascript处理DOM元素事件实现代码
2012/05/23 Javascript
AngularJS快速入门
2015/04/02 Javascript
纯JS实现旋转图片3D展示效果
2015/04/12 Javascript
Jquery幻灯片特效代码分享--打开页面随机选择切换方式(3)
2015/08/15 Javascript
JavaScript的Ext JS框架中的GridPanel组件使用指南
2016/05/21 Javascript
基于Bootstrap实现的下拉菜单手机端不能选择菜单项的原因附解决办法
2016/07/22 Javascript
AngularJS ng-blur 指令详解及简单实例
2016/07/30 Javascript
给easyui datebox扩展一个清空的实例
2016/11/09 Javascript
详解vue-cli + webpack 多页面实例配置优化方法
2017/07/13 Javascript
js学习总结_轮播图之渐隐渐现版(实例讲解)
2017/07/17 Javascript
vue watch自动检测数据变化实时渲染的方法
2018/01/16 Javascript
解决vue中监听input只能输入数字及英文或者其他情况的问题
2018/08/30 Javascript
微信小程序学习笔记之本地数据缓存功能详解
2019/03/29 Javascript
vue中使用[provide/inject]实现页面reload的方法
2019/09/30 Javascript
JQuery省市联动效果实现过程详解
2020/05/08 jQuery
详解vue高级特性
2020/06/09 Javascript
python根据距离和时长计算配速示例
2014/02/16 Python
python实现字符串和日期相互转换的方法
2015/05/13 Python
python自动发邮件库yagmail的示例代码
2018/02/23 Python
Python中一行和多行import模块问题
2018/04/01 Python
对python cv2批量灰度图片并保存的实例讲解
2018/11/09 Python
python列表生成器迭代器实例解析
2019/12/19 Python
如何学习Python time模块
2020/06/03 Python
英国网络托管和域名领导者:Web Hosting UK
2017/10/15 全球购物
英国领先的男装设计师服装独立零售商:Repertoire Fashion
2020/10/19 全球购物
会计与审计毕业生自荐信范文
2013/12/30 职场文书
职工代表大会主持词
2014/04/01 职场文书
2015年中学元旦晚会活动方案
2014/12/09 职场文书
党员带头倡议书
2015/04/29 职场文书
2015年度优秀员工获奖感言
2015/07/31 职场文书
python实现自动清理文件夹旧文件
2021/05/10 Python
Python Pandas pandas.read_sql_query函数实例用法分析
2021/06/21 Python
使用GO语言实现Mysql数据库CURD的简单示例
2021/08/07 Golang