双继承_在Python中使用双下划线防止类属性被覆盖!

在使用Python编写面向对象的代码时,我们会常常使用“继承”这种开发方式。例如下面这一段代码:

class Info:def __init__(self):passdef calc_age(self):print('我是父类的方法')
class PeopleInfo(Info):def __init__(self):super().__init__()def calc_age(self):print(123456)
复制代码

如果你使用 PeopleInfo 初始化一个对象,然后调用这个类的 calc_age 方法,我们来看看运行效果,如下图所示:

Python学习交流群:1004391443

8e2abba4b28921ebb467390a0fec16d7.png

可以看出,父类 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)
复制代码

运行效果如下图所示:

729b0f8c52485009aa1547d8d65243f9.png

这里你发现父类和子类的 __init__ 都被运行了。

不过你可能会强行解释为:在子类的 __init__ 里面,有一行 super().__init__() ,这个地方可能子类还没有完全覆盖父类,所以先运行了父类的方法。等到子类的 __init__ 全部执行完成以后,才会覆盖父类。

当然,这种强行诡辩显然是错误的,但为了证明这里你看到的现象和这个 super().__init__() 没有任何关系,我们不使用 __init__ ,而是自己定义一个:

class Info:def __init__(self):passdef __calc_age(self):print('我是父类的方法')def run_father(self):self.__calc_age()
class PeopleInfo(Info):def __init__(self):super().__init__()passdef __calc_age(self):print(123456)def run_son(self):self.__calc_age()
复制代码

运行效果如下图所示:

cf0c359a0f2ae871003e188bda68217c.png

从这里可以看出,父类和子类的 __calc_age 都成功运行了。

这是因为,在Python里面,类方法或者属性如果以双下划线开头,那么他们就是类的私有方法,在被继承的时候,即使子类有相同名字的以双下划线开头的属性或者方法也不会覆盖父类。

而且这些以双下划线开头的私有方法或者属性,在类内部可以自由被其他方法调用,但是在实例对象里面是不能直接调用的,如下图所示:

c8c54f6cd6efdfe8d9000c501af4d19a.png

那么Python是如何实现这一点的呢?实际上Python仅仅是改了一个名字而已。我们使用 dir 函数看看实例对象 kingname 里面有哪些内容,如下图所示:

ec607756887d90a5d49be8c1e04ae76c.png

大家请注意方框框住的内容,其中的 _Info__calc_age 就是父类中的 __calc_age ,而 _PeopleInfo__calc_age 就是子类中的 __calc_age 。Python仅仅是改了一个名字,在这种双下划线的私有方法或者私有属性的前面加上了 _类名 ,这样就确保了子类和父类的方法名不一致。

所以,虽然 在规范上,这种双下划线的私有方法和私有属性是不应该在外部访问的 ,但是如果你想强行访问,可以个使用这种改名以后的名字:

kingname = PeopleInfo()
kingname._PeopleInfo__calc_age()  # 强行调用子类的私有方法
kingname._Info__calc_age()  # 强行调用父类的私有方法
复制代码

运行效果如下图所示:

49f8cd5a6ab40bde6feec4af2adab64d.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532926.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云服务器 自有操作系统,云服务器 自有操作系统

云服务器 自有操作系统 内容精选换一换监控是保持云耀云服务器可靠性、可用性和性能的重要部分,通过监控,用户可以观察云耀云服务器资源。为使用户更好地掌握自己的云耀云服务器运行状态,公有云平台提供了云监控。您可以使用该服务监控您的云…

分割线不显示_90后都30岁了,为什么还不结婚

2020年中国第一批90后已经30岁了。在传统观念里,30岁作为人生的分水岭,成家,立业,结婚,生子,通通要在这之前解决掉,才算赶上了,人生的进度条,然而媒体针对90后&#xff0…

点到线段的距离_直线垂直,垂线的性质,点到直线的距离

欢迎关注公z号:沈阳奥数两条直线相交所成的四个角中,有一个角是直角时,就说这两条直线互相垂直,其中一条直线叫做另一条直线的垂线,它们的交点叫垂足。如图,直线AB与CD垂直于点E,记作&#xff1…

rasa算法_(十八)基于RASA开始中文机器人实现机制

前文介绍了基于RASA的总体架构,本文着重介绍一下实现细节。机器人管理概述框架是多租户SAAS系统,每个用户可以创建多个机器人,每个机器人关联独立的语料库,机器人能力,话术流程,在RASA中对应一个RASA运行实…

distinct返回null报错_C#之集合常用扩展方法与Linq

一、集合的常用扩展方法(lambda的方式)1.Where() 根据条件选择数据2.Select() 根据数据条件转换成新的数据类型,类似于DTO转换类3.Max() 根据条件选择最大值4.Min() 根据条件选择最小值5.OrderBy() 根据条件升序排序如果升序中Id都为1,那么就根据第二个条…

python tts 保存_Python 文件和目录操作学习

文件与文件路径文件有两个关键属性:文件名和路径。路径指明了文件在计算机上的位置。文件名中,最后一个句点之后的部分称为文件的“扩展名”,它指出了文件的类型目录也叫文件夹,文件夹可以包含文件和其他文件夹路径分隔符在 Windo…

图片 过度曝光_解读:摄影初学者,如何理性处理“曝光不足”与“曝光过度”...

曝光是摄影的基本要素之一,但是许多摄影初学者在曝光不足和过度曝光的问题上经常会遇到很多的困扰,甚至完全不知道如何处理这些问题。其实知道如何获得正确的曝光,并不是你了解曝光过度和曝光不足照片区别的唯一原因。因为创造性的表达比技术…

win7电脑误删鼠标键盘驱动_鼠标键盘,教您怎么解决键盘和鼠标失灵的问题

有的时候在我们使用电脑的过程中会突然间有键盘鼠标失灵的情况发生,而我们都是不明所以、不知所措的。对此,小编我给你们找了解决方法。接下来,就让我们一起往下看看关于键盘鼠标失灵的解决方法吧。键盘和鼠标都是电脑的重要组成部分&#xf…

airpods删除别人的配对_怎么不让别人连我的airpods

airpods很容易就被朋友拿混了,到时候分不清自己的airpods耳机是一件很尴尬的事情。那么,airpods如何避免和别人混拿?不拿出来是最好的解决办法,也可以提前设置不让别人连我的airpods,这样是最靠谱的方法。怎么不让别人…

jmeter安装包双击没反应_windows环境下Jmeter5.2的安装使用

标签:target 首页 环境变量 百度搜索 bsp nbsp htm targe oracl一、安装配置JDKJmeter5.2依赖JDK1.8 版本,JDK安装百度搜索JAVA下载JDK,地址:https://www.oracle.com/technetwork/java/javase/downloads/index.ht…

php把中文写入mysql_php写入mysql中文乱码的实例解决方法

php写入mysql出现中文乱码的解决办法是:在建立数据库连接之后,将该连接的编码方式改为中文。代码如下:$linkIDmysql_connect("localhost","root","admin");if(!$linkID){echo "数据库连接失败&#xff01…

mysql 导入.sql文件_MySQL导入.sql文件及常用命令

MySQL导入.sql文件及常用命令在MySQL Qurey Brower中直接导入*.sql脚本,是不能一次执行多条sql命令的,在mysql中执行sql文件的命令:mysql> source d:/myprogram/database/db.sql;另附mysql常用命令:一) 连接MYSQL&#xff…

mysql ubuntu 17.04_1、mysql 5.7 ubuntu17.04

系统:ubuntu17.04数据库主要分文档型和服务型两类:文档型:如sqlite3 (17.04自带/usr/bin/sqlite3)就是一个文件,应用在移动端如手机,pad,家电等服务型:如mysql有服务端(存储数据)和客户端mysql数…

mysql 查询倒数第二条记录_MySQL查询倒数第二条记录实现方法

有时候会用到查询倒数第二条记录lastHolderChangeHistory.find_by_sql([" SELECT * FROM holder_change_historieswhere treasure_id ?order by id desclimit 1,1 ",hch.treasure_id])select *from tablename awhere (select count(*)f…

kafka和mysql内存机制_一文五分钟让你彻底理解Kafka架构原理

对于kafka的架构原理我们先提出几个问题?1.Kafka的topic和分区内部是如何存储的,有什么特点?2.与传统的消息系统相比,Kafka的消费模型有什么优点?3.Kafka如何实现分布式的数据存储与数据读取?一、Kafka架构图1.kafka名词解释在一套kafka架构中有多个P…

centos mysql 互为主从_centos7 mysql互为主从+keepalived

一、互为主从配置1.1、资源情况192.168.11.177 server1192.168.11.180 server2192.168.11.210 VIP1.2、server1配置# vi /etc/my.cnf[mysqld]server-id1log-binmysql-binrelay_logmysql-realy-binrelay_log_indexslave-mysql-realy-bin.indexexpire_logs_days15binlog_formatmi…

手机apk签名工具安卓版_小飞鱼APK签名工具使用方法

小飞鱼APK签名工具是小飞鱼旗下的一款APK签名软件。是移动开发者必备的一款软件。使用方法1、双击运行小飞鱼APK签名工具.exe文件,出现如下界面:2、点击“功能”,没有签名证书的选择证书制作,制作完证书再选择APK签名,有证书的直接…

React 路由传参

引言 在上一篇中&#xff0c;我们学习了 React 中使用路由技术&#xff0c;以及如何使用 MyNavLink 去优化使用路由时的代码冗余的情况。 这一节我们继续上一篇 React 路由进行一些补充 1. Switch 解决相同路径问题 首先我们看一段这样的代码 <Route path"/home&q…

mysql 5.5 client 字符集_rhel4 mysql5.5 字符集_character set

和oracle字符集一样,有些晕,太细了小结:1,字符集分为:服务器,数据库,表,连接,列等对应参数为:mysql> show variables like chara%;------------------------------------------------------| Variable_name | Value |---------------------…

mysql heartbeat lvs_mysql+heartbeat+DRBD+LVS实现mysql高可用二

上一节&#xff0c;讲述了DRBD的安装&#xff0c;因为要利用heartbeatDRBDmysql实现mysql的高可用&#xff0c;所以这一节讲述安装mysql和heartbeat的安装分别在各个节点安装mysql&#xff0c;文本使用的是二进制的安装包mysql-5.5.33-linux2.6-x86_64.tar.gz[rootdrbd1 usr]# …