python核心阶段(五)—— 面向对象三大特性

1.封装

    概念:封装主要是指将一些属性和相关方法封装在一个对象中,对外隐藏内部具体实现细节

    作用:1)使用起来更加方便,类似于提供了一个工具箱

               2)保证数据的安全(设置私有属性)

               3)利于代码维护(代码维护时,直接在类内部修改即可,外部无需修改)

2.继承

 2.1 继承的基本知识

  • 概念:一个类"拥有"另外一个类的"资源"(指"非私有的"属性和方法使用权
  • 作用:资源重用                                                                                               
  • 分类:单继承(只继承了一个父类)、多继承(继承了多个父类)                                                     
  • 语法:  class 子类名(父类名):                                                                                                                                       pass                                                                                                                        父类名可以写多个,用逗号“,”隔开,越靠前继承的优先级越高                                              
  • 常用内置属性:__bases__                     查看类的所有父类构成元组                                                        
  • object 和 type 的区别:

        type:元类,是用来创建类的类

        object:类对象,主要是判别新式类(继承了object类)和经典类(没继承object类),                                              python3版本,在创建类时,默认继承object类,即:默认创建新式类

object 和 type 的区别

 2.2 继承下的影响 

    2.2.1 资源的继承

      在python中,继承是指对父类资源的使用权 /访问权

      除了私有的属性和私有的方法, 其他的基本都能继承(共有、受保护、内置)

      在子类中,不能修改父类的属性 / 方法,修改操作相当于在子类中新增一个同名属性

    2.2.2 资源的使用

  • 继承的几种形态以及遵循的准则
  • Python3.x之后新式类的方法解析顺序(MRO):C3算法
形态具体描述资源查找原则
单继承链一个子类只有一个父类

遵循"从下到上"的原则

自身 一> 父类 一> 父类的父类

无重叠的多继承链继承链无交叉, 无公共父类

遵循"单调"原则

 顺着一条链找到底

A 一> B 一> D 一> C 一> E

有重叠的多继承链继承链有交叉, 有公共父类

遵循"从下到上"的原则

一级一级查找

A 一> B 一> C 一> D

几种继承形态图示

  •  针对于几种标准原则的发展演变
针对于几种标准原则的发展演变

  • 查看某个类的资源查找顺序的语法:
法一(inspect包)

import  inspect 

  inspect.getmro(类名)

法二(mro属性)

类名.__mro__

法三(mro函数)

类名.mro()

    2.2.3 资源的覆盖

      资源覆盖包括属性的覆盖和方法重写。在MRO的资源检索链中,若优先级高的类和优先级低的类都写了一个一样的资源(属性或方法),则在获取资源时,会优先选择优先级高的类中的资源,而摒弃优先级低的资源,就造成了“覆盖”的假象

       注意:如果子类方法调用了父类的方法,那么此时参数self和cls是调用这个方法的那个类/属性

    2.2.4 资源的累加 

       概念:在一个类的基础之上, 增加一些额外的资源

  • 场景一:子类相比于父类, 多一些自己特有的方法/属性

        实现方式:直接在子类中定义就可

  • 场景二:在被“覆盖”的方法基础之上,新增新的内容(即:保留旧的某个方法并扩展新内容)

        实现方式一:在高优先级类的方法中, 通过"类名"调用低优先级类的方法

                              这里不能用实例调用,会导致self输入不一致

                    弊端:对于有重叠的多继承链,会产生重复调用;代码不易维护

class B:def __init__(self):self.weight = 60self.height = 1.75class A(B):  # A类继承了B类def __init__(self):B.__init__(self) # 通过类名调用B中的init,保留原来内容# 这里不能通过其他方式调用,会导致self输入不一致self.bmi = 1  # 新增额外内容a = A()
print(a.__dict__)

     

      实现方式二:在低优先级类的方法中, 通过"super"调用高优先级类的方法

              super是一个类,它只在新式类中有效,它主要起代理作用,帮助我们沿着MRO链条,找到下一个节点,去调用对应方法 

               语法:super(). 方法名           在 python3.x 的版本中,不需要填写参数,会自动补全

               实现原理:def super(cls参数一, inst参数二):
                                        mro = inst.__class__.mro()
                                        return mro[mro.index(cls) + 1]                                                                                    相当于沿着参数二的mro顺序,找到参数一对应的节点+1,即参数一的下一个节点

# 继承关系  A 一> B,C 一> D
# 在这种情况下,如果使用方法一在B C中调用D,再在A中调用B C,就会重复调用D两次
# 使用super调用,就不会重复出现
class D(object):def __init__(self):print("d")class B(D):def __init__(self):super().__init__()print("b")class C(D):def __init__(self):super().__init__()print("c")class A(B,C):def __init__(self):super().__init__()print("a")A()

3.多态

  • 多态大致有两种含义:

                  1)一个类, 所延伸的多种形态(animal可以延伸出dog cat...);                                                      2)调用时的多种形态(dog和cat中都有同一属性/方法,但调用时输出不同)

  • 多态在python中的体现:

          鸭子类型(动态类型的一种风格),它的关注点在于对象的"行为和属性"; 而非对象的"类型"

  •     回忆:

            python是强类型(类型强势,不会轻易自动修改)、动态类型(数据的类型在运行时可以                                                                                                                              判定,动态修改)              而多态一般是体现在静态语言中,所以在python中没有真正意义上的多态,也不需要多态 

4.补充:抽象类、抽象方法

  • 概念

         抽象类 是指一个抽象出来的类,并不是某一个具化的类,它是一个不能直接创建实例的类,                        主要是用于被其他类继承

         抽象方法 是指抽象出来的一个方法,不具备具体实现,不能直接调用                                                               如果一个类中有抽象方法,当他被继承时,继承他的类中必须要具体定义这个方法

  • 例子:

           animal类就是一个抽象类,他只是存储了所有动物的一些特性,但并不能直接去使用,因              为我们不知道到底是什么动物,同理animal的各种方法,如体型声音等也是如此

  • 在python中的实现:

          导入模块abc  ——> 设置类的元类为abc.ABCMeta  ——>  使用装饰器装饰抽象方法                                                                                                                     @abc.abstractmethod

5.案例 

  • 要求:

         1. 定义三个类, 小狗, 小猫, 人

         2.三个类具体要求如下:

            小狗: 姓名, 年龄(默认1岁);    吃饭, 玩, 睡觉, 看家(格式: 名字是xx, 年龄xx岁的小狗在xx)

            小猫: 姓名, 年龄(默认1岁);   吃饭, 玩, 睡觉, 捉老鼠(格式: 名字是xx, 年龄xx岁的小猫在xx)

            人:   姓名, 年龄(默认1岁), 宠物;  吃饭, 玩, 睡觉(格式: 名字是xx, 年龄xx岁的人在xx)
                    养宠物(让所有的宠物吃饭, 玩, 睡觉), 
                    宠物工作(让所有的宠物根据自己的职责开始工作) 

# 案例
# 我们发现在三个大类中,有很多相同的属性,所以我们可以先定义一个父类,让他们都继承即可class Animal():def __init__(self, name, age=1):self.name = nameself.age = agedef eat(self):print(f"{self}吃饭")def play(self):print(f"{self}玩")def sleep(self):print(f"{self}睡觉")class Person(Animal):   #定义人# 在创建小狗实例时,给它设置几个属性,所以这里应该定义实例属性def __init__(self,name,pet,age=1):super(Person,self).__init__(name,age)self.pet = petdef __str__(self):  # self本身的一个字符串描述  print(self)直接输出下面字符串return f"名字是{self.name}, 年龄{self.age}岁的人在"def yangPets(self):for pet in self.pet:pet.eat()pet.play()pet.sleep()def petWork(self):for pet in self.pet:pet.work()class Dog(Animal):  #定义狗类# 在创建小狗实例时,给它设置几个属性,所以这里应该定义实例属性def __init__(self, name, age=1):super(Dog,self).__init__(name,age)def work(self):print(f"{self}看家")def __str__(self):  # self本身的一个字符串描述  print(self)直接输出下面字符串return f"名字是{self.name}, 年龄{self.age}岁的小狗在"class Cat(Animal):  #定义猫类# 在创建小猫实例时,给它设置几个属性,所以这里应该定义实例属性def __init__(self, name, age=1):super(Cat,self).__init__(name,age)def work(self):print(f"{self}捉老鼠")def __str__(self):  # self本身的一个字符串描述  print(self)直接输出下面字符串return f"名字是{self.name}, 年龄{self.age}岁的小猫在"d = Dog("卡布",5)
c = Cat("喵喵",3)
p = Person("李明",[d,c],25)p.yangPets()
p.petWork()

6.总结:面向对象原则 SOLID(了解)

  • S:单一职责原则(一个类只负责一项职责)                                                                                      
  • O:开放封闭原则(对扩展开放,对修改关闭)                                                                                         
  •  L:里氏替换原则(使用父类引用的地方必须能使用子类对象)  
        
  •  I:接口分离原则(如果类包含了过多的接口方法,而这些方法在使用的过程中并非"不可分                                  割", 那么应当把他们进行分离)
          所谓接口, 在Python中, 可以简单的理解为"抽象方法                                                               
  •  D:依赖倒置原则(高层模块不应该直接依赖低层模,他们应该依赖抽象类或者接口块)
        
        

 

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

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

相关文章

高精度加法,减法,乘法,除法(下)(C语言)

前言 上一篇博客我们分享了高精度加法,减法,这一期我将为大家讲解高精度乘法和高精度除法。那让我们开始吧! 对加法和减法感兴趣的话就点我 文章目录 1,乘法2,除法3,尾声 1,乘法 让我们想想我们平时做数学…

openpyxl读取Excel文件忽略单元格公式仅读取所显示的值

目录 前言解决方案先不加:看读取信息加上参数:看读取信息完整代码 前言 我们在读取Excel文件时,假如某行或者某列是利用公式生成的,但是我们在利用openpyxl进行读取时,发现读取到的是公式,而非显示的值 解…

[⑧ADRV902x]: Digital Pre-Distortion (DPD)学习笔记

前言 DPD 数字预失真技术,是一种用于抑制功率放大器非线性失真的方法。 它通过在信号输入功率放大器(PA)之前插入一个预失真模块,对输入信号进行适当的调制,以抵消功率放大器引起的非线性失真,使功率放大器…

Ubuntu 安装 CUDA 和 cuDNN 详细步骤

我的Linux系统背景: 系统和驱动都已安装。 系统是centos 8。查看自己操作系统的版本信息:cat /etc/issue或者是 cat /etc/lsb-release 用nvidia-smi可以看到显卡驱动和可支持的最高cuda版本,我的是12.2。驱动版本是535.129.03 首先&#…

[足式机器人]Part2 Dr. CAN学习笔记-数学基础Ch0-9阈值选取-机器视觉中应用正态分布和6-sigma

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-数学基础Ch0-9阈值选取-机器视觉中应用正态分布和6-sigma 5M1E——造成产品质量波动的六因素 人 Man Manpower 机器 Machine 材料 Material 方法 Method 测量 Measurment 环境 Envrionment DMAI…

模块电源(六):前馈电容

一、前馈电容: 前馈电容是与电阻分压的顶部电阻 并联的"可选电容器" 二、计算及仿真: 1、计算 无前馈电容时,输出电压:;有前馈电容时,输出电压:,(其中,&am…

crmeb本地开发配置代理

crmeb 是一个开源的商城系统, v5 版本是一个前后端分离的项目, 我们从git仓库中下载下来的是一个文件夹,其结构是这样的 我的系统没有使用docker ,使用的是 laragon 的系统 所以首先我们要在 nginx 中配置 之后, 我们…

WebStorm:Mac/Win上强大的JavaScript开发工具

WebStorm是JetBrains公司开发的针对Mac和Windows系统的JavaScript开发工具。它为开发者提供了一站式的代码编辑、调试、测试和版本控制等功能,帮助你更高效地进行Web开发。新版本的WebStorm 2023在性能和用户体验方面都做出了重大改进,让你的JavaScript开…

为什么感染HPV的人越来越多?劲松中西医结合医院专家发表看法

近年来,HPV感染率在我国呈现上升趋势,引起了社会的广泛关注。HPV是一种人乳头瘤病毒,主要通过性接触传播,也是引起宫颈癌的主要原因之一。那么,为什么我国的HPV感染率如此高呢? 首先,我们需要了…

深度学习疲劳检测 驾驶行为检测 - python opencv cnn 计算机竞赛

文章目录 0 前言1 课题背景2 相关技术2.1 Dlib人脸识别库2.2 疲劳检测算法2.3 YOLOV5算法 3 效果展示3.1 眨眼3.2 打哈欠3.3 使用手机检测3.4 抽烟检测3.5 喝水检测 4 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习加…

远程服务器QEMU+Ubuntu+GRUB+VNC最佳实践

远程服务器QEMUUbuntuGRUBVNC最佳实践 1. 准备2. QEMU启动安装Ubuntu2.1 服务器端2.2 本地端 3. 从服务器终端控制虚拟机GRUB与虚拟机终端 这段时间参与大量内核切换测试工作,实体机需要硬件自检太过笨重,因此主要通过QEMU验证正确性。有一个很大的问题是…

JavaSE基础50题:11. 输出一个整数的每一位

概述 输出一个整数的每一位。 如:1234的每一位是4,3,2,1 。 个位:1234 % 10 4 十位:1234 / 10 123 123 % 10 3 百位:123 / 10 12 12 % 10 2 千位: 12 / 10 1 代码 ublic sta…

【小白专用】MySQL入门(详细总结)

3. 创建数据库 使用 create database 数据库名; 创建数据库。 create database MyDB_one; create database DBAliTest; 创建数据库成功后,数据库的数量变成了6个,多了刚才创建的 dbalitest 。 4. 创建数据库时设置字符编码 使用 create database 数据…

YouTube网红营销:出海品牌扩大影响力的关键

随着数字媒体的兴起,社交媒体已成为品牌与消费者之间建立联系的重要桥梁。其中,YouTube作为全球最大的视频分享平台,不仅拥有庞大的用户群体,还聚集了众多有影响力的网红。这些网红在各自的领域内拥有强大的话语权和号召力&#x…

虚拟化之指令的Trap和仿真

有时,虚拟机监控程序需要在虚拟机(VM)中模拟操作。例如,VM内的软件可能尝试配置与功耗管理或缓存一致性相关的低级处理器控件。通常,您不希望将VM直接访问这些控件,因为它们可能被用于突破隔离,或影响系统中的其他VM。 trap在执行给定操作(例如读取寄存器)时引发异常…

2023年全国职业院校技能大赛-大数据应用开发-数据可视化

可视化题目与以往相同,做法类似,我这里展示得到语句后处理优化以后的代码,以函数式来写可视化,比以前400-500多行代码简洁到100多行。其他题目见本栏目,那里面的代码都是没有优化后的,这次主要以效率和精简…

如何解压没有密码的7-zip文件?

7z压缩包设置了密码,解压的时候就需要输入正确对密码才能顺利解压出文件,正常当我们解压文件或者删除密码的时候,虽然方法多,但是都需要输入正确的密码才能完成。忘记密码就无法进行操作。 那么,忘记了7z压缩包的密码…

文件重命名大师:批量修改名称的终极指南

在处理大量文件时,我们往往需要修改它们的名称。无论是为了整理、归档还是为了满足某种特定需求,重命名文件都是一项常见的任务。然而,手动一个一个地修改文件名无疑是一项耗时且容易出错的工作。幸运的是,我们可以借助一些强大的…

Python---类的综合案例

1、需求分析 设计一个Game类 属性: 定义一个类属性top_score记录游戏的历史最高分 定义一个实例属性player_name记录当前游戏的玩家姓名 方法: 静态方法show_help显示游戏帮助信息 类方法show_top_score显示历史最高分 实例方法start_game开始当前…

13、pytest为失败的断言定义自己的解释

官方实例 # content of ocnftest.py from test_foocompare import Foodef pytest_assertrepr_compare(op, left, right):if isinstance(left, Foo) and isinstance(right, Foo) and op "":return["Comparing Foo instances:",f" vals:{left.val} !…