python类的属性前加上双下划线_Python中使用双下划线防止类属性被覆盖问题
在使用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 方法,我们来看看运行效果,如下图所示:
可以看出,父类 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)
运行效果如下图所示:
这里你发现父类和子类的 __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()
运行效果如下图所示:
从这里可以看出,父类和子类的 __calc_age 都成功运行了。
这是因为,在Python里面,类方法或者属性如果以双下划线开头,那么他们就是类的私有方法,在被继承的时候,即使子类有相同名字的以双下划线开头的属性或者方法也不会覆盖父类。
而且这些以双下划线开头的私有方法或者属性,在类内部可以自由被其他方法调用,但是在实例对象里面是不能直接调用的,如下图所示:
那么Python是如何实现这一点的呢?实际上Python仅仅是改了一个名字而已。我们使用 dir 函数看看实例对象 kingname 里面有哪些内容,如下图所示:
大家请注意方框框住的内容,其中的 _Info__calc_age 就是父类中的 __calc_age ,而 _PeopleInfo__calc_age 就是子类中的 __calc_age 。Python仅仅是改了一个名字,在这种双下划线的私有方法或者私有属性的前面加上了 _类名 ,这样就确保了子类和父类的方法名不一致。
所以,虽然 在规范上,这种双下划线的私有方法和私有属性是不应该在外部访问的 ,但是如果你想强行访问,可以个使用这种改名以后的名字:
kingname = PeopleInfo()
kingname._PeopleInfo__calc_age() # 强行调用子类的私有方法
kingname._Info__calc_age() # 强行调用父类的私有方法
运行效果如下图所示:
总结
以上所述是小编给大家介绍的Python中使用双下划线防止类属性被覆盖问题,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
本文标题: Python中使用双下划线防止类属性被覆盖问题
本文地址: http://www.cppcns.com/jiaoben/python/263870.html
python类的属性前加上双下划线_Python中使用双下划线防止类属性被覆盖问题相关推荐
- python中的单下划线和双下划线_python中的单下划线和双下划线
1. _ 的含义在python的类中,没有真正的私有化,不管是方法还是属性,为了编程的需要,约定加了下划线 _ 的属性和方法不属于API,不应该在类的外面访问,也不会被from M import * ...
- python怎么打出长下划线_Python 中的各种下划线操作你了解吗?
原标题:Python 中的各种下划线操作你了解吗? 我们在定义一些变量或者方法的时候,常常会用到下划线.在 Python 中,下划线的出镜率非常高,比如变量,有些是一个下划线开头的(_xx),有些是两 ...
- python用for循环一直出现最后一个值_python中for循环的list最后一个数据总会覆盖前面的数据...
问 题 1.如题,我真的是没办法了,用尽各种方法list的最后一个数据都会覆盖前面的数据. 2. class lotto_result_cl: def __init__(self, index, sp ...
- python类的属性前加上双下划线_在Python中使用双下划线防止类属性被覆盖
在使用Python编写面向对象的代码时,咱们会经常使用"继承"这种开发方式.例以下面这一段代码:python class Info: def __init__(self): pas ...
- 和python高级知识_Python中的5个高阶概念属性的知识点!你要了解明白哦!
在现代编程世界中,面向对象编程(OOP)语言在改变软件开发中的设计和实现模式方面发挥了进化作用.作为OOP家族的重要成员,Python在过去10年左右逐渐流行起来.与其他OOP语言一样,Python围 ...
- python横线怎么打_Python中的各种下划线
Python中有各种各样的下划线变量与函数,看了很多博客和讲解,但是感觉还是很乱.尤其是有人拿C++中的私有变量一说来解释Python下划线是完全错误的.Python中不存在私有变量(这里的私有变量指 ...
- 编写python程序、创建名为class的数据库_Python中的元类(metaclass)以及元类实现单例模式...
一.理解类也是对象 在理解元类之前,你需要先掌握Python中的类.Python中类的概念借鉴于Smalltalk,这显得有些奇特.在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在P ...
- python加上子类的特性_Python 中 Meta Classes详解
接触过 Django 的同学都应该十分熟悉它的 ORM 系统.对于 python 新手而言,这是一项几乎可以被称作"黑科技"的特性:只要你在models.py中随便定义一个Mode ...
- 两个类使用双冒号连接_C++中的双冒号作用
1. 作用域符号::的前面一般是类名称,后面一般是该类的成员名称,C++为例避免不同的类有名称相同的成员而采用作用域的方式进行区分 如:A,B表示两个类,在A,B中都有成员member.那么 A::m ...
- JavaIO流_下(NIO.2中Path、Paths、Files类的使用)
NIO.2中Path.Paths.Files类的使用 Java NIO 概述 Java NIO (New IO,Non-Blocking IO)是从Java 1.4版本开始引入的一套新的IO AP ...
最新文章
- Delphi中的线程类
- IoT勒索软件会演化为劫持软件
- 三面腾讯,已拿offer
- 从0到1,马蜂窝大交通团队如何构建高效研发流程体系?
- php date 有warning,php提示PHP Warning: date(): It is not safe to rely on the......错误的解决办法...
- NickLee 多層菜單
- Google Adwords/SEO关键字策略之Google Webmaster Tool数据方法
- win7备份工具_一键重装win7系统教程,如何重装win7系统
- nvm管理node版本
- JavaWeb开发Filter学习
- Zsh安装及常用操作
- Linux 常用软件
- 达摩院发布2021十大科技趋势(附PDF版)
- 手机自动休眠与距离感应器失效的问题
- 2017最新安卓版UI设计规范篇
- 综合布线系统带宽与计算机网络带宽计算题,计算机网络思考与练习题.doc
- PHP教程电子版下载
- r7000p装linux双系统,联想拯救者 刃7000台式机设置u盘启动(支持uefi/bios双启动)
- Android中常见的五种布局及特点
- “一见杨过误终身” ——体验式营销,你也可以创造传奇_营销人论坛