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 相关文章推荐
Linux中Python 环境软件包安装步骤
Mar 31 Python
python中 logging的使用详解
Oct 25 Python
Python实现识别手写数字 Python图片读入与处理
Mar 23 Python
tensorflow实现softma识别MNIST
Mar 12 Python
Python 查找list中的某个元素的所有的下标方法
Jun 27 Python
对python中的 os.mkdir和os.mkdirs详解
Oct 16 Python
python2.7使用plotly绘制本地散点图和折线图
Apr 02 Python
Python使用__new__()方法为对象分配内存及返回对象的引用示例
Sep 20 Python
anaconda3安装及jupyter环境配置全教程
Aug 24 Python
python实现二分查找算法
Sep 18 Python
pytorch学习教程之自定义数据集
Nov 10 Python
Python-typing: 类型标注与支持 Any类型详解
May 10 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/10/23 PHP
理解PHP中的Session及对Session有效期的控制
2016/01/08 PHP
PHP实现查询手机归属地的方法详解
2017/04/28 PHP
kindeditor 加入七牛云上传的实例讲解
2017/11/12 PHP
用js计算页面执行时间的函数
2006/12/07 Javascript
js正则表达式的使用详解
2013/07/09 Javascript
jQuery实现商品活动倒计时
2015/10/16 Javascript
ajax异步请求详解
2017/01/06 Javascript
JavaScript Date 知识浅析
2017/01/29 Javascript
vue2.0 自定义日期时间过滤器
2017/06/07 Javascript
vue2实现可复用的轮播图carousel组件详解
2017/11/27 Javascript
基于Vue 2.0的模块化前端 UI 组件库小结
2017/12/21 Javascript
vue单页应用在页面刷新时保留状态数据的方法
2018/09/21 Javascript
Node.js EventEmmitter事件监听器用法实例分析
2019/01/07 Javascript
微信小程序生成二维码的示例代码
2019/03/29 Javascript
Vue中全局变量的定义和使用
2019/06/05 Javascript
Node.JS枚举统计当前文件夹和子目录下所有代码文件行数
2019/08/23 Javascript
vue 查看dist文件里的结构(多种方式)
2020/01/17 Javascript
一个超级简单的python web程序
2014/09/11 Python
Python yield 使用浅析
2015/05/28 Python
Python复制文件操作实例详解
2015/11/10 Python
Python实现网站注册验证码生成类
2017/06/08 Python
关于python pyqt5安装失败问题的解决方法
2017/08/08 Python
Python 获取主机ip与hostname的方法
2018/12/17 Python
使用python读取.text文件特定行的数据方法
2019/01/28 Python
用python wxpy管理微信公众号并利用微信获取自己的开源数据
2019/07/30 Python
详解Django中异步任务之django-celery
2020/11/05 Python
使用phonegap操作数据库的实现方法
2017/03/31 HTML / CSS
美国摩托车头盔、零件、齿轮及配件商店:Cycle Gear
2019/06/12 全球购物
企业项目策划书
2014/01/11 职场文书
公司门卫管理制度
2014/02/01 职场文书
药店主任岗位责任制
2014/02/10 职场文书
研究生考核个人自我鉴定
2014/03/27 职场文书
2014年个人年终总结
2015/03/09 职场文书
婚礼男方父母答谢词
2015/09/29 职场文书
用基于python的appium爬取b站直播消费记录
2021/04/17 Python