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之不要红头文件(1)
Sep 28 Python
Python ldap实现登录实例代码
Sep 30 Python
Python实现破解猜数游戏算法示例
Sep 25 Python
解决python "No module named pip" 的问题
Oct 13 Python
opencv实现图片模糊和锐化操作
Nov 19 Python
python实现淘宝秒杀脚本
Jun 23 Python
wxPython实现整点报时
Nov 18 Python
解决torch.autograd.backward中的参数问题
Jan 07 Python
Tensorflow训练模型越来越慢的2种解决方案
Feb 07 Python
python 6.7 编写printTable()函数表格打印(完整代码)
Mar 25 Python
python如何从键盘获取输入实例
Jun 18 Python
python自动化调用百度api解决验证码
Apr 13 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生成的一个树叶图片画图例子
2014/04/16 PHP
PHP大转盘中奖概率算法实例
2014/10/21 PHP
ThinkPHP模版中导入CSS和JS文件的方法
2014/11/29 PHP
php计算title标题相似比的方法
2015/07/29 PHP
Yii配置与使用memcached缓存的方法
2016/07/13 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
php ajax数据传输和响应方法
2018/08/21 PHP
thinkphp3.2同时连接两个数据库的简单方法
2019/08/13 PHP
Javascript UrlDecode函数代码
2010/01/09 Javascript
js鼠标点击事件在各个浏览器中的写法及Event对象属性介绍
2013/01/24 Javascript
利用浏览器全屏api实现js全屏
2014/01/16 Javascript
基于jQuery实现表格的查看修改删除
2016/08/01 Javascript
微信小程序 for 循环详解
2016/10/09 Javascript
js阻止冒泡和默认事件(默认行为)详解
2016/10/20 Javascript
bootstrap学习使用(导航条、下拉菜单、轮播、栅格布局等)
2016/12/01 Javascript
让axios发送表单请求形式的键值对post数据的实例
2018/08/11 Javascript
为什么Vue3.0使用Proxy实现数据监听(defineProperty表示不背这个锅)
2019/10/14 Javascript
[01:19:54]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#1Alliance VS EHOME
2016/03/03 DOTA
一个计算身份证号码校验位的Python小程序
2014/08/15 Python
Python的Django框架中模板碎片缓存简介
2015/07/24 Python
浅谈Python的Django框架中的缓存控制
2015/07/24 Python
浅析Python中的多条件排序实现
2016/06/07 Python
python发送邮件功能实现代码
2016/07/15 Python
django页面跳转问题及注意事项
2019/07/18 Python
python实现异常信息堆栈输出到日志文件
2019/12/26 Python
python批量生成条形码的示例
2020/10/10 Python
凌阳科技股份有限公司C++程序员面试题笔试题
2014/11/20 面试题
新闻专业个人自我评价
2013/09/21 职场文书
人事部经理岗位职责
2014/03/07 职场文书
助人为乐模范事迹材料
2014/06/02 职场文书
安全施工责任书
2014/08/25 职场文书
2014年“世界无车日”活动方案
2014/09/21 职场文书
会议通知
2015/04/15 职场文书
2019银行员工个人工作自我鉴定
2019/06/27 职场文书
实战Python爬虫爬取酷我音乐
2022/04/11 Python
Valheim服务器 Mod修改安装教程 【ValheimPlus】
2022/12/24 Servers