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

news2024/12/24 12:47:39

无奋斗不青春

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈
入 门 教 程 推 荐 :👉👉 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个步骤,直到搜索不到下一级元素
    • 深度优先 继承资源查找顺序图示

    • 单继承

      • 6

    • 无重叠多继承

      • 无重叠多继承查找机制

    • 有重叠多继承

      • 8

* **问题点** * 在2.2版本之前的这种深度优先的查找顺序模式下,有重叠的多继承在资源查找上就存在问题,违背了“重写可用原则”。 * B2如果重写了C1中的资源,那么通过这种模式拿到的资源,还是C1中的原始资源,并不能拿到最新的B2中重写的资源 * **Python2.2** * 产生了新式类(继承自object类的类)(Python2.2版本开始才有object类) * 继承资源查找顺序遵守MRO原则 * 经典类:深度优先(从左到右) * 新式类:在深度优先(从左到右)的算法基础上优化了一部分:如果产生重复元素,会保留最后一个,并且更尊重基类出现的先后顺序 * 经典类 * 三种模式的继承资源查找顺序与2.2版本之前一致,就不再做动态图解了 * 新式类 * 单继承模式的继承资源查找顺序与经典类的单继承模式一样,图解省略 * 无重叠继承模式在变成新式类之后,实际上也就变成了有重叠继承模式了,只是最终的父类是object类 * [video(video-iZBEsVm6-1701851448079)(type-csdn)(url-https://live.csdn.net/v/embed/349567)(image-https://video-community.csdnimg.cn/vod-84deb4/206c498b940b71eebfea5420848d0102/snapshots/ea6890a1ba4a4967a0af0ef5e8e0ed1b-00003.jpg?auth_key=4855448791-0-0-803db5c925b75ab1797682f7e15e54f7)(title-9)]
  • 注意点:

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

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

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

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

  • 多继承模式

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

    • 10

  • 无重叠多继承模式图解
    *

  • Python2.3-2.7

  • Python3.x之后

资源的覆盖
资源的累加

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

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

相关文章

Android studio中如何生成jar包?

文章目录 需求背景目录结构gradle结构makeJar的语法解析 执行makeJar 任务拿到jar包 需求背景 别部门做C语言开发的同学开发了一个库&#xff0c;需要给我们Android端去调用。 我们拿到源码&#xff0c;首先需要做的是通过CMake去把C源码编译链接成动态库。 当然静态库也行&am…

NDIS协议驱动开发指南

文章目录 NDIS协议驱动开发指南1. 技术概览2. NDIS协议驱动2.1 BindAdapterHandlerEx2.2 SendNetBufferListsCompleteHandler2.3 ReceiveNetBufferListsHandler2.4 ProtocolNetPnpEvent 3. NET_BUFFER_LIST4. ndisprot实例5. 总结 NDIS协议驱动开发指南 我们知道&#xff0c;在…

Could not resolve all files for configuration ‘:app:debugCompileClasspath‘.

修改前 修改后 maven {url https://developer.huawei.com/repo/}

3DSEE:AI驱动的3D模型语义搜索引擎

3DSEE &#xff08;3D SEmantic Engine&#xff09;是基于 AI 技术的 3D 模型语义搜索引擎&#xff0c;可以自动提取 3D 模型内涵的语义信息并存储入库&#xff0c;以帮助用户使用自然语言或关键字高效地检索 3D 模型。3DSEE 提供完善的二次开发 API&#xff0c;无论使用Java、…

键盘打字盲打练习系列之反复练习——3

一.欢迎来到我的酒馆 盲打&#xff0c;反复练习&#xff01; 目录 一.欢迎来到我的酒馆二.数字符号键位指法 二.数字符号键位指法 前面的一个章节重点介绍了主键盘区字母键位的指法&#xff1a;基准键位指法、QWERTY字母键位指法、ZXCVBNM字母键位指法。大概练习一天的时间&…

【力扣】240.搜索二维矩阵

题目意思是从该矩阵之中查找出是否有和target一样的值&#xff0c;若有则返回true&#xff0c;无则返回false。这里我用的是java。总共有三种方法&#xff0c;分别是暴力解题法&#xff08;能过&#xff09;&#xff0c;二分查找法&#xff08;就是将二维数组拆分成m个二维数组…

2.8寸 ILI9341 TFTLCD 学习移植到STM32F103C8T6

2.8寸 ILI9341 TFTLCD 学习移植到STM32F103C8T6 文章目录 2.8寸 ILI9341 TFTLCD 学习移植到STM32F103C8T6前言第1章 LCD简介1.1 LCD硬件接口介绍 第2章 LCD指令介绍第3章 LCD 8080驱动方式3.1 8080写时序3.2 8080读时序 第4章 LCD 驱动代码部分4.1 修改代码部分4.2 代码工程下载…

【力扣】54. 螺旋矩阵

题解&#xff1a; 这里当然就不能只是通过双循环来解题了&#xff0c;因为会烦死。这道题的关键点在于左右边界的确定&#xff0c;参考官方解题法在这里写出我的解题思路。 首先看图&#xff0c;螺旋且顺时针&#xff0c;所以我们可以先遍历从左至右的&#xff0c;上边界加一…

[原创][2]探究C#多线程开发细节-“线程的无顺序性“

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delph…

【2023全网最全教程】web自动化测试入门

一、自动化测试基本介绍 1 自动化测试概述&#xff1a; 什么是自动化测试&#xff1f;一般说来所有能替代人工测试的方式都属于自动化测试&#xff0c;即通过工具和脚本来模拟人执行用例的过程。 2 自动化测试的作用 减少软件测试时间与成本改进软件质量通过扩大测试覆盖率…

大数据:sql,数据挖掘刷题

大数据&#xff1a;sql 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&#xff0c;尤其sql要学&…

Java 线程池到底是如何复用线程的

原理概述 其实 Java 线程池的实现原理很简单&#xff0c;说白了就是一个线程集合 workerSet 和一个阻塞队列 workQueue。 当用户向线程池提交一个任务时&#xff0c;线程池会先将任务放入 workQueue 中。workerSet 中的线程会不断的从 workQueue 中获取线程然后执行。当 work…

U3 词法分析

文章目录 一、定义1、任务2、构造3、输出形式 二、&#xff08;有穷状态&#xff09;自动机三、正则文法和状态图四、词法分析程序流程1、单词及内部表示2、词法分析程序需要引用的公共&#xff08;全局&#xff09;变量和过程 五、自动机1、DFA&#xff08;确定的有穷状态自动…

深耕中国成分,柳丝木打造茶小光IP赋能乡村振兴

随着全球可持续性发展理念的增强&#xff0c;越来越多品牌在行商业化道路之外&#xff0c;开始思考自身的社会责任&#xff0c;不断参与公益行动&#xff0c;践行ESG理念【Environmental&#xff08;环境&#xff09;、Social&#xff08;社会&#xff09;和 Governance &#…

HASH 哈希算法之MD5 算法

1. 哈希算法&#xff0c;用C 写的 #include <iostream> #include <iomanip> #include <cstring> #include <openssl/md5.h> #include <stdio.h>using namespace std;int main() {string str "hello world";unsigned char digest[MD5…

没有实权的PM如何做好项目管理?

在一些公司中&#xff0c;项目经理&#xff08;PM&#xff09;可能并没有实权&#xff0c;这种情况下如何做好项目管理呢&#xff1f;实际上&#xff0c;即使没有实权&#xff0c;PM仍然可以通过一些方法来确保项目的顺利进行。 首先&#xff0c;PM可以通过建立良好的沟通渠道来…

软著项目推荐 深度学习的视频多目标跟踪实现

文章目录 1 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的视频多目标跟踪实现 …

《opencv实用探索·十一》opencv之Prewitt算子边缘检测,Roberts算子边缘检测和Sobel算子边缘检测

1、前言 边缘检测&#xff1a; 图像边缘检测是指在图像中寻找灰度、颜色、纹理等变化比较剧烈的区域&#xff0c;它们可能代表着物体之间的边界或物体内部的特征。边缘检测是图像处理中的一项基本操作&#xff0c;可以用于人脸识别、物体识别、图像分割等多个领域。 边缘检测…

Streamlit框架的定制化

Streamlit框架的定制化 最近做了一个关于streamlit框架的项目&#xff0c;颇有感触&#xff0c;所以在这里记录一下。 什么是streamlit? Streamlit 是一个python的WEB UI库&#xff0c;它做了高度的封装以便于不懂后前端开发的人员也能轻松构建画面。你可以从官网进行详细的…

你真的掌握结构体了么?结构体习题(C语言)

前言 上一期博客我们学习了结构体的相关知识&#xff08;上期链接&#xff09;&#xff0c;但是学了不练也是不行的&#xff0c;我们今天讲给大家分享两道有点恶心的题目&#xff0c;让大家来加深对结构体的理解&#xff0c;那么话不多说我们现在开始吧&#xff01; 第一题 有…