【Python进阶】继承进阶和私有权限

目录

一、继承进阶

1、方法重写

2、调用父类方法

3、多层继承

二、私有权限

1、私有属性

2、私有方法


面向对象基础:小白也能看懂的Python基础教程(8)-CSDN博客

一、继承进阶

1、方法重写

当父类的同名方法达不到子类的要求,则可以在子类中对方法进行重写。语法:

class 父类名(object):def 方法A(self):代码...
class 子类名(父类名):def 方法A(self):代码...

例如,一起来完成:

(1)徒弟非常认真学习,终于掌握了老师傅的技术;

(2)接着,自己潜心钻研出类独门配方的全新摊煎饼技术;

(3)使用方法重写对摊煎饼方法进行处理。

# 1.老师傅: 父类
class Master(object):def make_cake(self):print("使用古法配方摊煎饼果子...")# 2.徒弟:子类  -父类方法达不到要求
class TuDi(Master):# 重写def make_cake(self):print("======潜心学习,专研了新的配方制作煎饼果子...")# 3.调用使用
tudi = TuDi()
tudi.make_cake()
print(TuDi.mro())

总结:

(1)当子类中出现与父类中同名方法且参数内容保持一致时,称为方法重写

(2)当子类重写了父类方法后,子类对象优先调用执行子类方法,可以通过【子类名.mro()】查看执行顺序。

2、调用父类方法

当子类要在父类同名方法的基础上,再新增功能且要求在子类中调用同名方法时,就可以使用super()。

super()语法:

super().方法名([参数1, 参数2, ...])

说明:

(1)super()表示父类;

(2).点表示的。

例如,一起来完成:

(1)徒弟在培训学校学习努力,不仅掌握了摊煎饼配方、还创办了自己煎饼果子的品牌;[配方、品牌]

(2)配合着一起摊煎饼,做出了更加美味的煎饼果子;

(3)使用调用父类方法在__init__()和摊煎饼方法中处理。


# 1.定义父类 [属性、方法]
class School(object):def __init__(self, pei_fang):self.pei_fang = pei_fangdef make_cake(self):print("父类,制作了美味的煎饼果子!!")# 2.定义子类
class TuDi(School):# 属性: 配方、品牌def __init__(self,pei_fange,brand):# self.pei_fang = pei_fange   # 提升代码的复用性super().__init__(pei_fange)self.brand = branddef make_cake(self):# 调用父类的方法super().make_cake()print("===========子类制作煎饼果子!!")# 3.创建对象、调用
tudi = TuDi("煎饼学校","方哥")
tudi.make_cake()

总结:

(1)super()可以简单的理解为:父类;

(2)当要在子类中调用父类的同名方法时,使用语法:super();

3、多层继承

多层继承指的是:多级继承的关系,比如:子类继承父类C、继续继承父类B、继续继承父类A等。

为了区分单继承、多继承和多层继承,看下图:

例如,一起来完成:

(1)N年后,当初的徒弟也老了;

(2)因此,徒弟想要把"有自己品牌,也有学校配方的煎饼果子"的所有技术传授给自己的小徒弟;

(3)请试着使用多层继承的方式完成案例。

# 1.A父类 学校
class School(object):def make_cake(self):print("----1-----煎饼学校:父类")# 2.B父类 徒弟
class TuDi(School):def make_cake(self):print("=====2======徒弟: 子、父类")# 3.子类 徒孙
class TuSun(TuDi):pass#------------------
tusun = TuSun()
tusun.make_cake()  #调用的时直接父类的方法,如果父类没有,则调用祖父类,否则就一直向上追溯

总结:

(1)简单地说,多层继承表示有多级父类;

(2)Python同时支持单继承、多继承和多层继承。

二、私有权限

1、私有属性

为了更好的限制属性的访问和包含隐私,可以给属性设置私有权限。

当把属性设置为私有属性后,则该属性只能被本类直接访问。

定义私有属性语法:

self.__属性名

设置和获取私有属性值语法:

class 类名(xxx):# 设置私有属性值[set]def set_私有属性名(self,参数):self.私有属性 = 参数# 获取私有属性值[get]def get_私有属性名(self):return self.私有属性

例如,一起来完成:

(1)FangGe把技术传承给小徒弟时,不想把自己的私房钱(¥6000000)继承给徒弟;

(2)这时,就要为私房钱这个属性设置私有权限;

(3)思考:若想要来访问私有属性,该怎么做呢?

#  ---------隐藏该隐藏的,暴露该暴露的--------------------------
# 1、定义父类
class Master(object):def __init__(self):self.__money = 0  # 私有属性# 对外提供修改私有属性的方法def set_money(self,money):self.__money = money# 对外提供一个获取私有属性的方法def get_money(self):return self.__moneymaster = Master()
# master.__money = 100  # 对象又自己添加了一个属性,不是私有属性# 修改私有属性
master.set_money(8000)# 获取私有属性
print(master.get_money())# 升级:
# 1.当子类继承了父类后, 子类就拥有了父类的属性和方法
# 2.当子类继承了父类后, 子类就拥有了父类的【非私有】属性和【非私有】方法

总结:

(1)当要定义私有属性时,仅需要在属性名前添加双下划线;

(2)注意:如果要从外部访问私有属性值,建议要在类中定义set/get方法。

2、私有方法

当把方法设置为私有方法后,则该方法只能被本类直接访问。

定义私有方法语法:

def __方法名(self):...

例如,一起来完成:

(1)FangGe把技术传承给小徒弟时,不想把自己独创配方的制作过程继承给徒弟;

(2)这时,就要为制作独创配方这个方法设置私有权限;

(3)思考:该怎么访问私有方法呢?

# 1.定义父类
class Master(object):def __make_secret(self):print("===================")print("加葱姜蒜...")print("加酱油,加白醋")print("辣椒面...")print("制作好卖给我的学生!!")print("===================")# 间接,我们可以封装一个方法,只有满足我的条件,才能调用私有方法,否则不能访问def use(self,info):if info == '衷心的徒弟':self.__make_secret()else:print('龟蛋!!!!!')print('--------------------------------')
master = Master()
# master.__make_secret()  # 不能在类外部调用私有方法master.use('衷心的徒弟')  # 不能在类外部调用私有方法

总结:

(1)当把方法设定为私有权限后,则该方法不会被继承给子类;

(2)注意:当子类继承了父类后,子类拥有父类的非私有属性和非私有方法;

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

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

相关文章

阿里云上kubesphere安装配置 - 使用阿里云负载均衡

教程参考 https://www.kubesphere.io/zh/docs/v3.3/installing-on-linux/public-cloud/install-kubesphere-on-ali-ecs/ 环境配置 关闭防火墙关闭selinux关闭swap分区时间同步hosts解析内核参数设置检查DNS安装ipvs安装依赖组件安装、设置docker每台机器都需要操作 #安装工具…

crossJoin笛卡尔积

crossJoin笛卡尔积 在Spark中,crossJoin方法用于执行两个数据集之间的笛卡尔积操作。具体来说,如果有两个数据集(DataFrame或Dataset),调用crossJoin方法将会生成一个新的数据集,其中包含两个原始数据集中所…

Monaco 中添加 CodeLens

CodeLens 会在指定代码行上添加一行可点击的文字,点击时可以触发定义的命令,效果如下: 通过调用 API 注册 LensProvider,点击时触发 Command,首先要注册命令,通过 editor.addCommand () 方法进行注册。三个…

7月9日学习打卡-回文链表,交叉链表

大家好呀,本博客目的在于记录暑假学习打卡,后续会整理成一个专栏,主要打算在暑假学习完数据结构,因此会发一些相关的数据结构实现的博客和一些刷的题,个人学习使用,也希望大家多多支持,有不足之…

python使用tkinter添加下载进度UI

添加进度组件 def download(): # 创建下载进度框progress_window tk.Toplevel()progress_window.title("下载进度")progress_label tk.Label(progress_window, text"正在下载视频文件...")progress_label.pack(pady10)progress_bar ttk.Progre…

【微信小程序开发实战项目】——个人中心页面的制作

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

canvas高清绘制与retina屏

一、retina屏 视网膜显示屏(英语:Retina Display)是一种由苹果公司设计和委托制造的现实屏幕,具备足够高像素密度而使得人体肉眼无法分辨其中单独像素点的液晶屏幕。 比如,初期Retina屏幕的分辨率为640960&#xff0…

在 PostgreSQL 里如何处理数据的版本跟踪和回滚?

文章目录 一、事务二、保存点三、使用版本控制扩展四、审计表和触发器五、使用时间戳列六、比较和还原数据七、考虑数据备份和恢复八、结论 在数据库管理中,数据的版本跟踪和回滚是非常重要的功能,有助于在数据操作出现错误或需要回滚到特定状态时进行有…

HINet: Half Instance Normalization Network for Image Restoration

论文:HINet: Half Instance Normalization Network for Image Restoration Abstract: 在本文中,我们探讨了实例归一化在低级视觉任务中的作用。 具体来说,我们提出了一个新颖的块:半实例归一化块(HIN 块&…

洛谷 数学进制 7.9

P1100 高低位交换 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 代码一 #include<bits/stdc.h> using namespace std; typedef long long ll; #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)const ll N1e510; char a[N];int main() {IOS;ll a;int b[32]…

十分钟且一次性带你学懂泛型编程思想(模板化思想)

引言 在编程的世界里&#xff0c;泛型编程思想&#xff08;模板化思想&#xff09;是一种极具魅力的编程范式。它允许我们编写出具有高度通用性和可重用性的代码&#xff0c;极大地提高了开发效率和代码质量。无论你是初学者还是有一定经验的开发者&#xff0c;掌握泛型编程思想…

GNU/Linux - 什么是loopback设备

在计算机科学中&#xff0c;特别是在类Unix操作系统中&#xff0c;环回设备&#xff08;loopback device&#xff09;是一种虚拟设备&#xff0c;它将一个文件映射为块设备。这使得可以像访问物理磁盘或分区一样访问一个文件。环回设备通常用于挂载磁盘镜像、操作文件系统镜像以…

【单链表】05 有一个带头结点的单链表L,设计一个算法使其元素递增有序。

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux算法题上机准备 &#x1f618;欢迎 ❤️关注 &#x1f44d;点赞 &#x1f64c;收藏 ✍️留言 题目 有一个带头结点的单链表L,设计一个算法使其元素递增有序。 算法思路 解决办法有很多&…

代码随想录训练营第三十三天 509斐波那契数列 70爬楼梯 746使用最小花费爬楼梯

第一题&#xff1a; 原题链接&#xff1a;509. 斐波那契数 - 力扣&#xff08;LeetCode&#xff09; 本题很简单&#xff0c; 递推公式&#xff1a;dp[i] dp[i - 1] dp[i - 2]; 初始化dp[0] 0; dp[1] 1; 顺序遍历即可 代码如下&#xff1a; class Solution { public…

商品分页,商品模糊查询

一、商品分页 引入分页 定义分页主件的参数 在请求url上拼接参数 定义改变当前页码后触发的事件&#xff0c;把当前页码的值给到分页表单&#xff0c;重新查询 二、商品查询&#xff08;以商品的名称查询name为例&#xff09; 引入elementplus的from表单组件 定义一个FormData…

实现在列表框内及列表框间实现数据拖动:在工作表界面窗体的加载

《VBA高级应用30例》&#xff08;版权10178985&#xff09;&#xff0c;是我推出的第十套教程&#xff0c;教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开&#xff0c;这套教程案例与理论结合&#xff0c;紧贴“实战”&#xff0c;并做“战术总结”&#xff0c;以…

three-platformize 微信小程序 uniapp 使用截图功能

最近需要将3d场景进行截图&#xff0c;但是网上的各种各样&#xff0c;看的我一团乱麻&#xff0c;因此在解决完后就将这些简单的分享一下&#xff1b; 原理&#xff1a;将3维场景的那个canvas中的像素提取出来&#xff0c;找一个空的canvas二维画布放上去&#xff0c;然后用二…

jitsi 使用JWT验证用户身份

前言 Jitsi Meet是一个很棒的会议系统,但是默认他运行所有人创建会议,这样在某种程度上,我们会觉得他不安全,下面我们就来介绍下使用JWT来验证用户身份 方案 卸载旧的lua依赖性sudo apt-get purge lua5.1 liblua5.1-0 liblua5.1-dev luarocks添加ubuntu的依赖源,有则不需…

运维锅总详解设计模式

本首先简介23种设计模式&#xff0c;然后用Go语言实现这23种设计模式进行举例分析。希望对您理解这些设计模式有所帮助&#xff01; 一、设计模式简介 设计模式是软件设计中用于解决常见设计问题的一套最佳实践。它们不是代码片段&#xff0c;而是解决特定问题的通用方案。设…

Xilinx 的aarch32 aarch64 armr5 编译器区别

对于 Xilinx 设备&#xff0c;特别是使用 Vivado 或 Vitis IDEs 开发的那些&#xff0c;针对不同 ARM 架构如 aarch32、aarch64 和 ARM R5&#xff0c;使用的编译器也会有所不同。以下是这些架构在 Xilinx 开发环境中常用的编译器&#xff1a; 1. AArch32 (ARM 32位) 对于 Xi…