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 = 60
        self.height = 1.75

class 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 = name
        self.age = age

    def 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 = pet

    def __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:依赖倒置原则(高层模块不应该直接依赖低层模,他们应该依赖抽象类或者接口块)
        
        

 

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

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

相关文章

python3.5安装教程及环境配置,python3.7.2安装与配置

大家好,小编来为大家解答以下问题,python3.5安装教程及环境配置,python3.7.2安装与配置,现在让我们一起来看看吧! python 从爬虫开始(一) Python 简介 首先简介一下Python和爬虫的关系与概念&am…

MagicAnimate

简介 新加坡国立大学 Show 实验室和字节联合做了一项类似的研究。他们提出了一个基于扩散的框架 MagicAnimate,旨在增强时间一致性、忠实地保留参考图像并提升动画保真度。并且,MagicAnimate 项目是开源的,目前推理代码和 gradio 在线 demo …

好莱坞明星识别

一、前期工作 1. 设置GPU from tensorflow import keras from tensorflow.keras import layers,models import os, PIL, pathlib import matplotlib.pyplot as plt import tensorflow as tfgpus tf.config.list_physical_devices("GPU")if gpus:gpu0 …

MySQL数据备份

一、逻辑备份 备份的是建表、建库、插入等操作所执行SQL语句,适用于中小型数据库,效率相对较低。 本质:导出的是SQL语句文件 优点:不论是什么存储引擎,都可以用mysqldump备成SQL语句 缺点:速度较慢&…

周星驰 互联网3.0 团队下个月将上线独立 App

2023年12月7日,新浪科技报道指出,周星驰旗下的互联网3.0团队透露,Moonbox,这家周星驰创立的互联网3.0初创公司,计划在明年1月份完成Moonbox App的上线,届时该应用将免费向用户提供服务。 目前,…

外包干了三年,我承认我确实废了……

没错,我也干过外包,一干就是三年,三年后,我废了…… 虽说废的不是很彻底,但那三年我几乎是出差了三年、玩了三年、荒废了三年,那三年,我的技术能力几乎是零成长的。 说起这段三年的外包经历&a…

git 克隆无权限-重新输入账号密码

克隆项目代码时提示没有权限,有可能是没有登录账号,也可能是账号密码改了,运行下面指令,然后重新克隆项目,下载的时候会让你重新输入账号密码,则克隆成功 git config --global credential.helper cache 参考…

043:vue项目一直出现 sockjs-node/info?t=XX的解决办法

第043个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下,本专栏提供行之有效的源代码示例和信息点介绍,做到灵活运用。 (1)提供vue2的一些基本操作:安装、引用,模板使…

Spark大数据集群日常开发过程遇到的异常及解决思路汇总

原创/朱季谦 在开发Spark任务过程中,遇到过不少新人经常可能会遇到的坑,故而将这些坑都总结了下来,方便日后遇到时,可以快速定位解决,壁面耗费过多时间在查找问题之上。 一、出现java.lang.IllegalAccessError: tried…

AGM CPLD 应用指南

AGM的部分料号跟Altera 硬件Pin to Pin兼容,映射关系表如下: EPM240T100CxN—>AG256SL100(CPLD) EPM240T100IxN---->AG256SL100(CPLD) EPM570T100CxN—>AG576SL100(CPLD) EPM570T100IxN---->AG576SL100(CPLD) EPM570T144CxN—>AG576SL144…

机器人纯阻抗控制接触刚性环境

问题描述 在机器人学中,阻抗控制是一种常用的控制策略,用于管理机器人在与环境交互时的运动和力。阻抗控制背后的关键概念是将环境视为导纳,而将机器人视为阻抗。 纯阻抗控制接触刚性环境时,机器人的行为方式主要受其阻抗参数的…

虚拟化之指令的Trap和仿真

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

二分查找算法

文章目录 二分查找二分的实战讲解二分查找普通二分模版 在排序数组中查找元素的第一个和最后一个位置万能二分模版 总结 二分查找 什么是二分查找:就是定义左右2个指针(此指针非真指针)取中间值 通过一次次取中间值找到要找到的数 二分的实战讲解 二分查找 题目:地址 题目解析…

实现SQL server数据库完整性

1.创建一个数据库名为“erp” 主数据文件:初始容量为5MB,最大容量为50MB,递增量为1MB,其余参数自设。事务日志文件:初始容量为3MB,最大容量为20MB,递增量为10%,其余参数自设。 创建…

Linux下c开发

编程环境 Linux 下的 C 语言程序设计与在其他环境中的 C 程序设计一样, 主要涉及到编辑器、编译链接器、调试器及项目管理工具。编译流程 编辑器 Linux 中最常用的编辑器有 Vi。编译连接器 编译是指源代码转化生成可执行代码的过程。在 Linux 中,最常用…

WMMSE方法的使用笔记

标题很帅 原论文的描述WMMSE的简单应用 无线蜂窝通信系统的预编码设计问题中,经常提到用WMMSE方法设计多用户和速率最大化的预编码,其中最为关键的一步是将原和速率最大化问题转化为均方误差最小化问题,从而将问题由非凸变为关于三个新变量的…

Vue3实现一个拾色器功能

​ <template><div class"color"><button v-if"hasEyeDrop" click"nativePick">点击取色</button><input v-else type"color" input"nativePick" v-model"selectedColor" /><p&…

【学一点儿前端】真机调试本地公众号网页项目

前言 微信公众号网页开发的真机调试一直是很头疼的事情。 原因一 微信公众号配置的JS安全域名只有三个&#xff0c;一个大中型的公众号这三个JS安全域名都是生产的域名&#xff0c;不可能预留域名用于开发和调试。 原因二 在微信里面只有访问正确的安全域名才能调用wx.config用…

Ubuntu 22.04源码安装yasm 1.3.0

sudo lsb_release -r看到操作系统的版本是22.04&#xff0c;sudo uname -r可以看到内核版本是5.15.0-86-generic&#xff0c;sudo gcc --version可以看到版本是11.2.0&#xff0c;sudo make --version可以看到版本是GNU Make 4.3。 下载yasm http://yasm.tortall.net/Downlo…

《Android编程权威指南》之第二个activity源码及挑战

文章目录 前言效果图依赖MainactivityKotlin的“ &#xff1f;”kotlin的符号 QuizViewModelQuestion类CheatActivityonBackPressed()companion CheatViewModelstring.xml 前言 实现禁止一题多答&#xff0c;按题记录作弊状态、偷看次数限制、横竖屏切换依旧保存状态数据 个人…