035.Python面向对象_三大特性_封装、继承、多态

无奋斗不青春

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈
入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈
虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈
PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈
Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈
优 质 资 源 下 载 :👉👉 资源下载合集 👈👈

分隔线

这里写目录标题

    • 面相对象三大特性
      • 封装
        • 封装的概念
        • 封装的好处
      • 继承
        • 继承的概念
        • 继承的目的
        • 继承的分类
          • 单继承
          • 多继承
        • type类和object类
      • 继承对资源的影响
        • 资源的继承
        • 资源的使用
          • 继承的几种形态
          • 资源继承的标准顺序
        • 继承资源查找顺序的演化过程
        • 资源的覆盖
        • 资源的累加

面相对象三大特性

封装

封装的概念
  • 将一些属性和相关方法封装在一个对象中,对外隐藏内部具体实现细节
    • 类似于【电脑主机】,内部实现,外界不需要关心,外界只需要根据“内部提供的接口”去使用就可以
封装的好处
  • 1、使用起来更加方便
    • 把很多相关的功能封装成一个整体
    • 类似于向外界提供一个工具箱
    • 针对不同的场景,使用不同的工具箱就可以
  • 2、保证数据的安全性
    • 针对安全级别高的数据,可以设置成“私有”
    • 可以控制数据位只读,外界无法修改
    • 也可以拦截数据的写操作,进行数据验证和过滤
  • 3、利于代码维护
    • 如果后期,功能代码需要维护,则直接修改这个类内部代码即可
    • 只要保证接口名称不变,外界则不需要做任何代码修改
  • 前面讲的[私有化属性]、[只读属性]都是封装的体现

继承

继承的概念
  • 一个类“拥有”另外一个类的“资源”的方式之一
    • 拥有:并不是资源的复制,而是资源的“使用权”
    • 资源:指“非私有的”属性和方法
  • 继承关系中类的名称
    • 被继承的类:父类、超类、基类
    • 继承的类:子类、派生类
继承的目的
* 方便资源的重用
继承的分类
单继承
  • 概念
    • 仅仅继承了一个父类
  • 语法
    class Animal:
        pass
        
    # 单继承
    class Dog(Animal):
        pass
    
多继承
  • 概念
    • 继承了多个父类
  • 语法
    class Animall:
        pass
        
    class Dog:
        pass
     
    # 多继承    
    class keji(Dog, Animall):
        pass
    
type类和object类
  • 查看取指定类的父类(基类)

    cls.__bases__
    
  • 查看制定对象由哪个类创建(实例化)

    • 类的本身也是对象
    obj.__class__
    
  • 示例

    class Animal:
        pass
    
    class Dog:
        pass
    
    class Keji(Animal, Dog):
        pass
    
    d = Dog()
    d.eat = '肉'
    
    # 查看制定类的父类
    print(Keji.__bases__)           # (<class '__main__.Animal'>, <class '__main__.Dog'>)
    print(Dog.__bases__)            # (<class 'object'>,)
    print(Animal.__bases__)         # (<class 'object'>,)
    
    print(object.__bases__)         # ()
    
    print(int.__bases__)            # (<class 'object'>,)
    print(float.__bases__)          # (<class 'object'>,)
    print(str.__bases__)            # (<class 'object'>,)
    print(bool.__bases__)           # (<class 'int'>,)
    
    # 查看对象由谁创建
    print(d.__class__)             # <class '__main__.Dog'>
    print(d.eat.__class__)         # <class 'str'>
    
    print(Keji.__class__)           # <class 'type'>
    print(Dog.__class__)            # <class 'type'>
    print(Animal.__class__)         # <class 'type'>
    
    print(object.__class__)         # <class 'type'>
    print(type.__class__)           # <class 'type'>
    
    print(int.__class__)            # <class 'type'>
    print(float.__class__)          # <class 'type'>
    print(str.__class__)            # <class 'type'>
    print(bool.__class__)           # <class 'type'>
    
  • 关系图

    • 在这里插入图片描述
  • 复习

    • 元类:Type类(创建类对象的类)
    • 经典类:不继承自object类的类
    • 新式类:继承自object类的类

继承对资源的影响

资源的继承
  • 在Python中,继承是指资源额使用权。资源能否被继承,其实就是在子类中能否访问到父类当中的这个资源(属性和方法)
  • 类内部的公有属性/方法、受保护属性/方法、内置方法均可被继承,只有私有属性/方法不可以被继承
  • 继承仅仅只是访问并不能被设置
    公有        # a = 777       # 可以被继承
    受保护      # _b = 888      # 可以被继承
    私有        # __c = 999     # 不能被继承
    内置        # __init__      # 可以被继承
    
  • 查看示例
    class Animal:
        a = 777
        _b = 888
        __c = 999
    
        def t1(self):
            print('t1')
    
        def _t2(self):
            print('_t2')
    
        def __t3(self):
            print('__t3')
    
        def __init__(self):
            print('Animal  __init__')
    
    
    class Person(Animal):
        def test(self):
            print(self.a)           # 777
            print(self._b)          # 888
            # print(self.__c)     # 报错:AttributeError: 'Person' object has no attribute '_Person__c'
    
            self.t1()               # t1
            self._t2()              # _t2
            # self.__t3()           # 报错:AttributeError: 'Person' object has no attribute '_Person__t3'
            self.__init__()         # Animal  __init__
    
    
    p = Person()
    p.test()
    
资源的使用
继承的几种形态
  • 单继承链
  • 无重叠的多继承
  • 有重叠的多继承
    • 在这里插入图片描述
资源继承的标准顺序
  • 单继承链
    def C:
        pass
        
    def B(C):
        pass
        
    def A(B):
        pass
    
    • 先从自身(A)内部查找 ——> 到父类(B)内部查找 ——> 到父类的父类(C)内部查找
  • 无重叠的多继承(遵循单调原则)
    def C2:
        pass
        
    def C1:
        pass
    
    def B2(C2):
        pass
        
    def B1(C1):
        pass
        
    def A(B1, B2):
        pass
    
    • 先从自身(A)内部查找 ——> 到左侧父类(B1)内部查找 ——> 到左侧父类的父类(C1)内部查找 ——> 到右侧父类(B2)内部查找 ——> 到右侧父类的父类(C2)内部查找
  • 有重叠的多继承
    def C1:
        pass
    
    def B2(C1):
        pass
        
    def B1(C1):
        pass
        
    def A(B1, B2):
        pass
    
    • 先从自身(A)内部查找 ——> 到左侧父类(B1)内部查找 ——> 到右侧父类(B2)内部查找 ——> 到父类的父类(C1)内部查找
  • 继承资源查找顺序图
    • 在这里插入图片描述
继承资源查找顺序的演化过程
  • Python2.2之前

    • 仅存在经典类(不继承自object类)

    • 继承资源查找顺序遵守MRO原则-深度优先(从左往右)

    • 知识补充

      • MRO(Method Resolution Order):方法解析顺序
      • 深度优先:沿着一个继承链,尽可能的往深了去找
      • 深度优先具体算法步骤
        • 1、先把根节点压入栈中
        • 2、每次从栈中弹出一个元素,搜索所有在它下一级的元素
        • 3、重复第2个步骤,直到搜索不到下一级元素
    • 深度优先 继承资源查找顺序图示

    • 单继承

    • 无重叠多继承

    • 有重叠多继承

  • 问题点

    • 在2.2版本之前的这种深度优先的查找顺序模式下,有重叠的多继承在资源查找上就存在问题,违背了“重写可用原则”。
    • B2如果重写了C1中的资源,那么通过这种模式拿到的资源,还是C1中的原始资源,并不能拿到最新的B2中重写的资源
  • Python2.2

  • 产生了新式类(继承自object类的类)(Python2.2版本开始才有object类)

  • 继承资源查找顺序遵守MRO原则

    • 经典类:深度优先(从左到右)
    • 新式类:在深度优先(从左到右)的算法基础上优化了一部分:如果产生重复元素,会保留最后一个,并且更尊重基类出现的先后顺序
  • 经典类

    • 三种模式的继承资源查找顺序与2.2版本之前一致,就不再做动态图解了
  • 新式类

    • 单继承模式的继承资源查找顺序与经典类的单继承模式一样,图解省略
    • 无重叠继承模式在变成新式类之后,实际上也就变成了有重叠继承模式了,只是最终的父类是object类
  • 注意点:

  • 2.2版本这种查找顺序有点类似“广度优先模式”,但是并不是!

  • 稍微了解一下“广度优先模式”

    • 1、把根节点放到队列的末尾
    • 2、每次从队列的头部取出一个元素,搜索这个元素所有的下一级元素,并将其放到队列的末尾(发现元素已经被处理过,则略过)
    • 3、重复第2步,直到队列为空则结束
  • 队列的进出原则:先进先出(区别于栈的先进后出原则)

  • 单继承模式深度优先于广度优先是没有区别的,区别在于多继承模式

  • 多继承模式

    • 入栈是先右后左,出栈是先左后右(先进后出)
    • 入队列是先左后右,出队列也是先左后右(先进先出)
  • 有重叠多继承模式图解

  • 无重叠多继承模式图解

  • Python2.3-2.7

  • Python3.x之后

资源的覆盖
资源的累加

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux横向移动

Linux横向移动 主机存活探测 shell for i in 192.168.111.{1..254}; do if ping -c 3 -w 3 $i &>/dev/null; then echo $i is alived; fi; done 或者 for k in $( seq 1 255);do ping -c 1 192.168.1.$k|grep "ttl"|awk -F "[ :]" {print $4}; d…

现代雷达车载应用——第1章 雷达简介

“雷达”一词代表无线电探测和测距。雷达是一种电磁系统&#xff0c;用于探测、定位、跟踪和识别一定区域内的不同物体。雷达向目标方向发射电磁能量&#xff0c;以观察目标的回波。目标可以是船只、飞机、天体、汽车等。在早期&#xff0c;雷达系统由于体积庞大&#xff0c;成…

MATLAB Simulink +STM32硬件在环 (HIL)实现例程测试

MATLAB Simulink STM32硬件在环 &#xff08;HIL&#xff09;实现例程测试 &#x1f4cd;相关篇《STM32CubeMxMATLAB Simulink点灯程序》✨本例程没有使用到STM32CubeMX来创建工程&#xff08;在Simulink 中不是选择的STM32xxxbased类型的&#xff09;。 &#x1f516;STM32xxx…

代码随想Day24 | 回溯法模板、77. 组合

理论基础 回溯法和递归不可分割&#xff0c;回溯法是一种穷举的方法&#xff0c;通常需要剪枝来降低复杂度。回溯法有一个选择并退回的过程&#xff0c;可以抽象为树结构&#xff0c;回溯法的模板如下&#xff1a; void backtracking(参数) {if (终止条件) {存放结果;return;}…

【数据结构】——二叉树简答题模板

目录 一、树和二叉树的概念&#xff08;一&#xff09;二叉树的定义和性质&#xff08;二&#xff09;树和二叉树的区别 二、完全二叉树和满二叉树三、二叉树的遍历&#xff08;一&#xff09;由序列确定二叉树&#xff08;二&#xff09;不同遍历序列的关系 四、二叉树的性质&…

在Vivado 仿真器中搭建UVM验证环境(不需要联合modelsim)

Vivado 集成设计环境支持将通用验证方法学 (UVM) 应用于 Vivado 仿真器。Vivado 提供了预编译的 UVM V1.2 库。 &#xff08;1&#xff09;在 Vivado 2019.2 中创建新 RTL 工程。 &#xff08;2&#xff09;单击“添加目录 (Add Directories)”以将“src”和“verif”目录添加…

【LeetCode】每日一题 2023_12_3 可获得的最大点数(前缀和/滑动窗口/贪心)

文章目录 刷题前唠嗑题目&#xff1a;可获得的最大点数题目描述代码与解题思路 结语 刷题前唠嗑 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 题目&#xff1a;可获得的最大点数 题目链接&#xff1a;1423. 可获得的最大点数 题目描述 代码与解题思路 …

Tuxera NTFS2024安装包下载教程

在听到小凡的电话说“Tuxera NTFS for Mac软件安装失败&#xff0c;怎么办”的时候&#xff0c;小编心里真像有一万头草泥马在奔腾——苹果软件还能安装失败&#xff01;&#xff1f; 挥手把一万头草泥马赶走&#xff0c;脑补着苹果软件的安装&#xff0c;小编对着电话吼道&am…

【JavaEE进阶】 Spring 的创建和使⽤

文章目录 &#x1f334;前言&#x1f38b;创建 Spring 项⽬&#x1f6a9;创建⼀个 Maven 项⽬&#x1f6a9;添加 Spring 框架⽀持&#x1f6a9;添加启动类 &#x1f333;存储 Bean 对象&#x1f6a9;创建Bean&#x1f6a9;将 Bean 注册到容器 &#x1f332;获取并使⽤ Bean 对象…

【头歌系统数据库实验】实验6 SQL的多表查询-2

目录 第1关&#xff1a;查询每个选手的信息及其提交的解答信息&#xff0c;没做题的选手不显示 第2关&#xff1a;查询做了1001题且耗时大于500&#xff08;time&#xff09;的选手信息 第3关&#xff1a;查询所有选手信息及其提交的解答信息&#xff0c;没做题的选手也要显…

nodeJS爬虫-爬取虎嗅新闻

1.安装依赖库到本地&#xff0c;需要的库有&#xff1a;安装方法见Node.js笔记说明 const superagent require(superagent); const cheerio require(cheerio); const async require(async); const fs require(fs); const url require(url); const request require(reques…

JVM 类加载机制(七)

1.加载&#xff0c;验证&#xff0c;准备&#xff0c;解析&#xff0c;初始化 ​ JVM 类加载机制分为五个部分&#xff1a;加载&#xff0c;验证&#xff0c;准备&#xff0c;解析&#xff0c;初始化&#xff0c;下面我们就分别来看一下这五个过程。 1.1. 加载 ​ 加载是类加…

【laBVIEW学习】4.声音播放,自定义图标,滚动条设置,保存参数以及恢复参数

一。声音播放&#xff08;报错&#xff0c;未实现&#xff09; 1.报错4810 2.解决方法&#xff1a; 暂时未解决。 二。图片修改 1.目标&#xff1a;灯泡---》自定义灯泡 2.步骤&#xff1a; 1.右键点击--》自定义运行 表示可以制作自定义类型 2.右键--》打开自定义类型 这样就…

Java文件导出实现流程(一)

Java文件导出实现流程 参考资料&#xff1a;https://blog.51cto.com/u_16175476/7509744 简介 在Java开发中&#xff0c;文件导出是一项常见的功能。它可以将数据以文件的形式保存到本地或者服务器中&#xff0c;方便用户进行查看和下载。本文将指导你如何使用Java实现文件导出…

Java利用UDP实现简单的双人聊天

一、创建新项目 首先创建一个新的项目&#xff0c;并命名。 二、实现代码 import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.net.*; import java.io.IOException; import java.lang.String; public class liaotian extends JFrame{ pri…

HXDSP2441-HXD(DSP)在线仿真器

HXD&#xff08;DSP&#xff09;在线仿真器 DSP下载器将数据通过网口转为JTAG时序&#xff0c;需用5V DC外部供电&#xff0c;下载器ip固定为192.168.1.40&#xff0c;PC与下载器正常连接后即可ping通&#xff0c;具体使用方法参考《HXD在线仿真器使用手册》&#xff0c;Demo板…

Linux--程序地址空间

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 [TOC](文章目录) 一、程序地址空间回顾 我们在讲C语言的时候&#xff0c;老师给大家画过这样的空间布局…

可视化监管云平台EasyCVR宠物粮食食品厂智能视频监控方案

由于我国养宠物群体的不断膨胀&#xff0c;宠物市场也占据了经济的很大一部分&#xff0c;宠物做为人类的好朋友&#xff0c;可以给人们带来极高的精神抚慰&#xff0c;作为“毛孩子”家长&#xff0c;爱宠人士自然不会亏待自家宠物&#xff0c;都会选择最好的口粮以供宠物食用…

力扣每日一题:2646. 最小化旅行的价格总和(2023-12-06)

力扣每日一题 题目&#xff1a;2646. 最小化旅行的价格总和 日期&#xff1a;2023-12-06 用时&#xff1a;30 m 14 s 时间&#xff1a;8ms 内存&#xff1a;42.98MB 思路&#xff1a;先统计旅行中每个节点路过的次数&#xff08;dfs方法&#xff09;&#xff0c;再计算减半后的…

DriveWorks——参数化设计非标定制利器

DriveWorks基本介绍 DriveWorks是一套被 SOLIDWORKS 认可为金牌合作伙伴产品的设计自动化软件。DriveWorks 可自动创建特定于订单的销售文档和 SOLIDWORKS 制造数据。减少重复性任务&#xff0c;消除错误&#xff0c;增加销售额&#xff0c;并在创纪录的时间内交付定制产品。 为…