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设计模式之抽象工厂模式
Aug 25 Python
python3.4下django集成使用xadmin后台的方法
Aug 15 Python
浅谈python迭代器
Nov 08 Python
python 自动去除空行的实例
Jul 24 Python
Python变量类型知识点总结
Feb 18 Python
VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法详解
Jul 01 Python
python程序文件扩展名知识点详解
Feb 27 Python
Python ADF 单位根检验 如何查看结果的实现
Jun 03 Python
python爬取音频下载的示例代码
Oct 19 Python
Pycharm Plugins加载失败问题解决方案
Nov 28 Python
python中出现invalid syntax报错的几种原因分析
Feb 12 Python
OpenCV项目实践之停车场车位实时检测
Apr 11 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安全性漫谈
2012/06/28 PHP
有道搜索和IP138的IP的API接口(PHP应用)
2012/11/29 PHP
CI框架中集成CKEditor编辑器的教程
2014/06/09 PHP
php each 返回数组中当前的键值对并将数组指针向前移动一步实例
2016/11/22 PHP
PHP微信PC二维码登陆的实现思路
2017/07/13 PHP
javascript中interval与setTimeOut的区别示例介绍
2014/03/14 Javascript
js实现class样式的修改、添加及删除的方法
2015/01/20 Javascript
jquery插件jSignature实现手动签名
2015/05/04 Javascript
微信小程序 二维码canvas绘制实例详解
2017/01/06 Javascript
bootstrap动态添加面包屑(breadcrumb)及其响应事件的方法
2017/05/25 Javascript
Angular 4依赖注入学习教程之InjectToken的使用(八)
2017/06/04 Javascript
解决webpack -p压缩打包react报语法错误的方法
2017/07/03 Javascript
浅谈ES6新增的数组方法和对象
2017/08/08 Javascript
如何选择适合你的JavaScript框架
2017/11/20 Javascript
微信小程序实现美团菜单
2018/06/06 Javascript
解决百度Echarts图表坐标轴越界的方法
2018/10/17 Javascript
JavaScript实现答题评分功能页面
2020/06/24 Javascript
[01:21]辉夜杯战队访谈宣传片—CDEC
2015/12/25 DOTA
Python选择排序、冒泡排序、合并排序代码实例
2015/04/10 Python
详解Python list 与 NumPy.ndarry 切片之间的对比
2017/07/24 Python
Python使用三种方法实现PCA算法
2017/12/12 Python
python图书管理系统
2020/04/05 Python
Python subprocess模块功能与常见用法实例详解
2018/06/28 Python
python使用time、datetime返回工作日列表实例代码
2019/05/09 Python
Python时间差中seconds和total_seconds的区别详解
2019/12/26 Python
使用tensorboard可视化loss和acc的实例
2020/01/21 Python
Python爬虫入门有哪些基础知识点
2020/06/02 Python
Python如何执行系统命令
2020/09/23 Python
IE9下html5初试小刀
2010/09/21 HTML / CSS
HTML5之tabindex属性全面解析
2016/07/07 HTML / CSS
结构工程研究生求职信
2013/10/13 职场文书
文明村创建实施方案
2014/03/27 职场文书
基层干部个人对照检查及整改措施
2014/10/28 职场文书
会议通知
2015/04/15 职场文书
唱歌比赛拉拉队口号
2015/12/25 职场文书
golang三种设计模式之简单工厂、方法工厂和抽象工厂
2022/04/10 Golang