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 相关文章推荐
利用打码兔和超人打码自封装的打码类分享
Mar 16 Python
Python实现提取文章摘要的方法
Apr 21 Python
浅谈Python中用datetime包进行对时间的一些操作
Jun 23 Python
python实现神经网络感知器算法
Dec 20 Python
python selenium 对浏览器标签页进行关闭和切换的方法
May 21 Python
Python连接Redis的基本配置方法
Sep 13 Python
python按时间排序目录下的文件实现方法
Oct 17 Python
用Pelican搭建一个极简静态博客系统过程解析
Aug 22 Python
nginx+uwsgi+django环境搭建的方法步骤
Nov 25 Python
python os.path.isfile 的使用误区详解
Nov 29 Python
Pytorch自己加载单通道图片用作数据集训练的实例
Jan 18 Python
python打包生成so文件的实现
Oct 30 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
神族 PROTOSS 概述
2020/03/14 星际争霸
PHP中使用foreach和引用导致程序BUG的问题介绍
2012/09/05 PHP
PDO操作MySQL的基础教程(推荐)
2017/08/18 PHP
PHP分页显示的方法分析【附PHP通用分页类】
2018/05/10 PHP
PHP时间类完整代码实例
2021/02/26 PHP
javascript 简单高效判断数据类型 系列函数 By shawl.qiu
2007/03/06 Javascript
javascript 类型判断代码分析
2010/03/28 Javascript
EXTJS记事本 当CompositeField遇上RowEditor
2011/07/31 Javascript
基于jquery的bankInput银行卡账号格式化
2012/08/22 Javascript
不用构造函数(Constructor)new关键字也能实现JavaScript的面向对象
2013/01/11 Javascript
9款2014最热门jQuery实用特效推荐
2014/12/07 Javascript
JS动态给对象添加事件的简单方法
2016/07/19 Javascript
js中getBoundingClientRect的作用及兼容方案详解
2018/02/01 Javascript
Node.js中的child_process模块详解
2018/06/08 Javascript
4个顶级开源JavaScript图表库
2018/09/29 Javascript
nodejs中request库使用HTTPS代理的方法
2019/04/30 NodeJs
js实现弹窗效果
2020/08/09 Javascript
vue 防止页面加载时看到花括号的解决操作
2020/11/09 Javascript
[07:27]DOTA2卡尔工作室 英雄介绍水晶室女篇
2013/06/21 DOTA
Python+PIL实现支付宝AR红包
2018/02/09 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
2019/01/19 Python
python 图像增强算法实现详解
2021/01/24 Python
HTML5 CSS3打造相册效果附源码下载
2014/06/16 HTML / CSS
介绍一下如何利用路径遍历进行攻击及如何防范
2014/01/19 面试题
介绍一下Linux内核的排队自旋锁
2014/01/04 面试题
医学院学生求职简历的自我评价
2013/10/24 职场文书
工作自我评价分享
2013/12/01 职场文书
项目开发计划书
2014/01/09 职场文书
党员学习十八大感想
2014/01/17 职场文书
材料加工工程求职信
2014/02/19 职场文书
超市国庆节促销方案
2014/02/20 职场文书
满月酒主持词
2014/03/27 职场文书
《泉水》教学反思
2014/04/11 职场文书
交通事故委托书范本(2篇)
2014/09/21 职场文书
《分数乘法》教学反思
2016/02/24 职场文书
从np.random.normal()到正态分布的拟合操作
2021/06/02 Python