|Python新手小白中级教程|第二十八章:面向对象编程(类定义语法私有属性类的继承与多态)(4)

文章目录

  • 前言
  • 一、类定义语法
  • 二、私有方法和私有属性
    • 1.私有属性
    • 2.私有方法
  • 三、类“继承”
    • 1.初识继承
    • 2.使用super函数调用父类中构造的东西
  • 四、类“多态”
    • 1.多态基础
    • 2.子类不同形态
    • 3.使用isinstance函数与多态结合判断类型
  • 总结

前言

大家好,我是BoBo仔吖,上3节课我们学习了类的基础知识。这节课,我们要讲一些深入的东西。
是什么呢?看看就知道!

一、类定义语法

其实,我们学习的class类都可以看做我们定义的功能语法
之前我讲解type函数的时候也说到了我们的牢大class
这是我们的文章
https://blog.csdn.net/m0_69481332/article/details/138410028?spm=1001.2014.3001.5501
这里有一个内容要注意:
在这里插入图片描述
这幅图片我给大家扣过来了,大家会发现:这里我们通过type函数判断类型后(其实,list等等也是一个类哦),下面的输出是<class'类型'>
大家是不是也看看让自己的类的语法形式?使用type方法即可!

还是有栗子:
在这里插入图片描述
这是我们上次的例子
我们都知道,我们把类GameB赋予了变量game_begin
所以,我们用type来检验它的时候便反映了它的类语法形式,也就是GameB
这里还有一个main

<class '__main__.GameB'>

这里出现了__main__方法,因为这是我们自己定义的类语法空间

这就是类定义语法,非常简单似不似?
接下来,我们学习一些更加深入的内容

二、私有方法和私有属性

1.私有属性

我们还是把我们之前的例子拿出来

class GameB:def __init__(self,exp,grade):self.exp = expself.grade = gradedef print_message(self):print('经验值',self.exp)print('等级',self.grade)game_begin = GameB('0',1)
game_begin.print_message()
print(type(game_begin))

这里我们把class GameB的设定叫做定义类,而其中的函数则称为方法
为什么要扯概念?因为这个东东非常重要

接下来,我们来讲一个和上文一点不搭噶的东西

class Dog:def __init__(self,name):self.__name = nameself.__age = Noneprint(self.__name,'生成成功!')def set_age(self,age):if not isinstance(age,int):#这里的函数isinstance是判断它括号内的两个参数中,参数1是否是参数2的类型,如果不是就执行下面的操作,通常作为条件使用print('输入的年龄必须是数字!')return Falseif age <= 0:print('年龄必须大于0!')return Falseself.__age = agedef play(self):print('汪汪汪!我今年',self.__age)dog =Dog('旺财')
dog.set_age('hello!')
dog.set_age(-20)
dog.set_age(3)
dog.play()

这是一个生成dog角色的函数,这里我们发现有一个非常眼生的东西:私有属性
私有属性的属性呢和他的本身命名的特性差不多,是一个“私有”属性
大家可以把私有属性看做一件事情:
我们在家里可能穿睡衣,穿拖鞋;但是,我们在外面就不会穿的这么奇怪
我们就可以把家里看做class类里,外面看做class类外的代码,这样大家是不是就理解多了呢?

这里的结构是__(下划线×2)对象名
这个私有属性呢与我们普通的属性有一个显著的特点就是他不能直接改动,而是需要在某个特定的函数中再次修改,且不能再类以外的地方调用
例如这里,我们构造了两个私有属性,它们是__age__name
属性age只能通过类中的set_age修改,不能再外部直接改动,否则会发生错误
就像这样:
在这里插入图片描述
当然,有私有属性就有私有方法

2.私有方法

这里的方法概念上面提到了,就是我们所封装的函数
私有方法的理解也可以向上文那样:你在家里休息日时可能9点起,12点睡,打游戏,吃KFC;但是,你上学或是工作时就必须早起,调整作息。
我们还是把家看做类代码,把外面看做类以外的代码

我们还是以类Dog为例,构造私有方法__say(self,name)
代码如下:

class Dog:def __say(self,name):print(name)def play(self):print('汪汪汪!')dog = Dog()
dog.play()

这里我们的私有方法没有起任何作用
而且,这里不能通过类以外区域来修改这个函数,否则会出现错误

大家学会私有概念了吗?如果学会,那么你的类使用就更加灵活咯!!!

三、类“继承”

继承呢我们往往会联想到一些时间:老父亲的特征往往会继承给儿女,这就是生理继承(DNA继承)
这种广义上的继承想必大家都知道,那么,在类里,继承是什么一种概念呢?
还是甩出刚刚的示例,就是那个生成doggy的模型
这里我们看源代码,看看有什么相同和不同

1.初识继承

class Animal:def __init__(self,name):self.name = name def play(self):print('我是',self.name)class Dog(Animal):#注意看,这就是继承的格式!!pass#这里我们没有私有方法,所以这里我们在下面调用的时候调整就可以了dog = Dog('旺财')#这里继承了Animal类中的方法,赋给dog之后,就可以转而通过Dog类调用Animal的内容
dog.play()

这里我们的继承类采用的是这样的格式:

class 类名【子类】(主类名【或者叫父类】):

我们通过继承的手法可以更加灵活地使用父类里的东西,而且还能修改(私有属性或私有方法除外,不可继承),更加灵活。这里我们的父类Animal受了Dog的调用,如果我们在dog里修改animal类,那么效果会更加良好

2.使用super函数调用父类中构造的东西

class Animal:def __init__(self,name):self.name = namedef play(self):print('我是',self.name)class Dog(Animal):def __init__(self):print('旺财')dog = Dog()

在这个例子里,我们在dog类中继承了Animal,但是由于没有调用play,所以只能输出旺财

但是,我们如果直接使用方法play,那么就会出错,因为我们使用的是类Dog里的构造方法,而不是类Animal的构造方法,尽管我们继承了Animal类
如果我们要实现animal类的构造方法,那么我们就要用到super() 内置函数

就像这样:

class Animal:def __init__(self, name):self.name = namedef play(self):print('我是', self.name)class Dog(Animal):def __init__(self):super(Dog,self).__init__('旺财')dog = Dog()
dog.play()

我们使用super函数来调用我们在Animal类中所继承的__init__构造方法,完之后就可以直接使用play来运行Animal类中的内容了
怎么样,是不是很神奇?

四、类“多态”

多态是基于继承上的一种形式,我们可以把它大致理解为“父类的多个子类”
还是以类Animal为例,来看看使用多态后结果如何

1.多态基础

还是这个例子

class Animal:def say(self):print('Animal')class Dog(Animal):passclass Cat(Animal):passdog = Dog()
dog.say()cat = Cat()
cat.say()

这里我们用两个形式来继承Animal,它们分别是类Dog和类Cat
我们的两个子类继承父类Animal之后,使用了父类中的方法say,这个大家应该能理解
接下来,我们来看点深层的内容

2.子类不同形态

这里我们的目标是使用2个不同的子类来通过共同继承父类Animal来输出不同的内容

其实也不难,只要在类Dog与Cat中分别加入自己的内容即可

具体代码如下:

class Animal:def say(self):print('Animal')class Dog(Animal):def say(self):print('Dog')class Cat(Animal):def say(self):print('Cat')dog = Dog()
dog.say()cat = Cat()
cat.say()

这里我们的输出就是Dog与Cat了,我们共同使用了自己所继承的方法来创造自己不同的结果,这就是多态的体现

3.使用isinstance函数与多态结合判断类型

这个isinstance函数呢大家不陌生,之前的一个章节中我就用它判断过类型:对,就是实战的那一章,我用这个来判断输入类型(构造旺财的那一课,大家可以翻翻我之前的文章找一找)
具体格式我就不说了,大家可以自己根据我使用的方法自己练练手
接下来我们直接上代码
我们的isinstance函数和我们的多态是有关系的,所以我把他放在这里节里讲解

首先,我们像刚刚那样使用dog变量与cat变量分别迭代类Dog与类Cat

class Animal:def say(self):print('Animal')class Dog(Animal):def say(self):print('Dog')class Cat(Animal):def say(self):print('Cat')dog = Dog()
cat = Cat()

好,不要眨眼,接下来就是重头戏!

我们这里其实也能把cat与dog变量看做一种调用继承的形式。根据这个逻辑,我们可以用isinstance来判断继承的正误,简称来说就是看是不是亲生的
在这里插入图片描述

OK,我们先上代码

class Animal:def say(self):print('Animal')class Dog(Animal):def say(self):print('Dog')class Cat(Animal):def say(self):print('Cat')dog = Dog()
cat = Cat()print(isinstance(dog,Dog))
print(isinstance(dog,Animal))
print(isinstance(cat,Cat))
print(isinstance(cat,Animal))

这里我们的输出是:

True
True
True
True

好,现在我们知道了,dog和cat都是自己的祖宗亲生的了
在这里插入图片描述
接下来,我们就要好好琢磨琢磨
首先,我们把后面几行单独剔出来检查

dog = Dog()
cat = Cat()print(isinstance(dog,Dog))
print(isinstance(dog,Animal))
print(isinstance(cat,Cat))
print(isinstance(cat,Animal))

我们这里使用dog和cat两个变量“继承”了类Dog,Cat与Animal
所以,我们的这里的输出是正确的

我之前讲过,其实我们的数据类型,像int,float,str,list等等,其实都是一个类,我们只要使用isinstance函数就能看出,逗号“,”前的是不是逗号“,”后的类型。所以,大家现在懂数据类型与类的关联性原理了吧

总结

好了,今天的内容到此结束。实在是写不动了,下次再努力吧
下节课,我们将学习类的最后一讲:拓展篇,大家敬请期待!如有不懂,别忘了问我哟!下期见~~~

【制作不易,别忘了一圈三连,点个关注!!!】

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

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

相关文章

6818Linux内核开发移植

Linux内核开发移植 Linux内核版本变迁及其获得 Linux是最受欢迎的自由电脑操作系统内核&#xff0c; 是一个用C语言写成&#xff0c; 并且符合POSIX标准的类Unix操作系统 Linux是由芬兰黑客Linus Torvalds开发的&#xff0c; 目的是尝试在英特尔x86架构上提供自由免费的类Un…

Task Office for Mac v9.0激活版:任务管理新境界

还在为繁琐的任务管理而烦恼吗&#xff1f;Task Office for Mac为您带来全新的任务管理体验。简洁明了的界面设计&#xff0c;让您轻松上手&#xff1b;强大的任务管理和项目管理功能&#xff0c;让您轻松掌握任务进度&#xff1b;多用户协作功能&#xff0c;让团队协作更加高效…

Excel办公技巧之下拉菜单

在日常办工中&#xff0c;经常需在单元格中输入特定的值&#xff0c;此时我们可以使用下拉菜单解决&#xff0c;输入错误和错误值&#xff0c;可以一劳永逸的解决固定数据输入问题。 使用Excel下拉菜单时&#xff0c;它在数据输入和验证方面发挥着重要作用通过点击单元格的下拉…

商业数据分析--时间序列图及趋势分析

绘制时间序列图,并指出存在什么样的状态如上两图: 可见状态:从时间序列图可以看出,这些数据存在明显的季节性波动,每年的第4季度值都最高,而第2季度值最低。同时也存在一些下降的趋势。 通过引进虚拟变量,建立多元线性回归模型。答: 通过引入虚拟变量,我们可以建立如下的…

商场学习之微服务

前言 寒假前在新电脑上配置了java环境&#xff0c;maven仓库&#xff0c;node,js&#xff0c;navicat&#xff0c;MySQL&#xff0c;linux&#xff0c;vmware等环境&#xff0c;创建了6个mysql数据库&#xff0c;77张表。 如此多的表&#xff0c;字段&#xff0c;去手写基础…

Web入门——三栏布局页面

前置知识 内外边距 内边距(padding)&#xff1a; padding是元素边框与其内容之间的空间。也就是说&#xff0c;如果你给一个元素设置了内边距&#xff0c;这个空间会作为元素内容与元素边框之间的缓冲区域。设置内边距会使元素本身变大。例如padding:10px就创建了10像素的空间…

Qt之QMqtt 发送图片数据

简述 MQTT(消息队列遥测传输)是ISO标准下基于发布/订阅范式的消息协议;它工作在TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件; MQTT是一个基于客户端-服务器的消息发布/订阅传输协议;MQT…

Docker in Docker(DinD)原理与实战

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Docker幻想曲&#xff1a;从零开始&#xff0c;征服容器宇宙》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Docker简介 2、Docker …

使用 AI Assistant for Observability 和组织的运行手册增强 SRE 故障排除

作者&#xff1a;Almudena Sanz Oliv, Katrin Freihofner, Tom Grabowski 通过本指南&#xff0c;你的 SRE 团队可以实现增强的警报修复和事件管理。 可观测性 AI 助手可帮助用户使用自然语言界面探索和分析可观测性数据&#xff0c;利用自动函数调用来请求、分析和可视化数据…

windows系统安装Ubuntu子系统

安装前先在 控制面板 中打开 程序与功能选项 &#xff0c;点击 启用或关闭Windows功能&#xff1a; 勾选 适用于 Linux的Windows子系统 和 虚拟机平台 、 Hyper-v 。 重启电脑后再 Microsoft Store Windows应用商店 中下载合适的Ubuntu版本。 运行Ubuntu程序&#xff0c;如出现…

【实战】算法思路总结

面试过程中&#xff0c;总是被拷打&#xff0c;信心都要没了。但是也慢慢摸索出一些思路&#xff0c;希望对大家有帮助。 &#xff08;需要多用一下ACM模式&#xff0c;力扣模式提供好了模板&#xff0c;自己在IDEA里面写的话&#xff0c;还是会有些陌生&#xff09; 0、基本…

Unity Editor 找物体助手

找啊找朋友~ &#x1f371;功能介绍&#x1f959;使用方法 &#x1f371;功能介绍 &#x1f4a1;输入相关字符串&#xff0c;它会帮你找到名称中带有该字符串的所有物体&#xff0c;还会找包含该字符串的Text、TextMeshProUGUI。 &#x1f959;使用方法 &#x1f4a1;导入插…

小学拼音弄一下

import re from xpinyin import Pinyindef remove_middle_characters(text):# 仅保留汉字chinese_chars re.findall(r[\u4e00-\u9fff], text)cleaned_text .join(chinese_chars)# 如果字符数为偶数&#xff0c;则在中间添加空格if len(cleaned_text) % 2 0:middle_index le…

【北京迅为】《iTOP-3588从零搭建ubuntu环境手册》-第5章 安装SSH

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

从0开始学python(七)

目录 前言 1 break、continue和pass函数 1.1 break 1.2 continue 1.3 pass 2、序列的索引及切片操作 2.1字符串的索引和切片 2.1.1 字符串索引 2.1.2 字符串切片 总结 前言 上一篇文章我们介绍了python中的循环结构&#xff0c;包括for和while的使用。本章接着往下讲。…

腾讯云服务器之ssh远程连接登录及转发映射端口实现内网穿透(实现服务器访问本地电脑端口)

目录 一、创建密钥绑定实例二、设置私钥权限三、ssh远程连接到服务器四、修改root密码五、端口转发&#xff08;实现服务器访问本地电脑的端口&#xff09; 一、创建密钥绑定实例 创建密钥会自动下载一个私钥&#xff0c;把这个私钥复制到c盘 二、设置私钥权限 1、删除所有用户…

免费剪辑的素材资源网站,超高清、可商用、不限速、无版权,迅速有效的解决您的视频剪辑难题!

在数字媒体时代&#xff0c;高质量的剪辑素材已成为视频制作的核心资源。下面为您推荐的优质视频剪辑素材网站&#xff0c;都提供超高清、无限速、无版权、可商用的素材&#xff0c;这些网站将大大提升您的视频制作效率和质量 01. 蛙学府 实用性&#xff1a;★★★★☆ 丰富性&…

记一些CISP-PTE题目解析

0x01 命令执行 直接payload: 127.0.0.1 & whoami&#xff0c;发现可以成功执行whoami命令 然后ls …/ &#xff0c;发现有个key.php文件 尝试用cat命令查看 发现不行被拦截了。&#xff08;其实题目过滤了常用的查看文件的命令 &#xff09; 这里有两种思路&#xff0c;第…

关于一致性,你该知道的事儿(下)

关于一致性&#xff0c;你该知道的事儿&#xff08;下&#xff09; 前言一、并发修改单个对象1.1 原子写操作1.2 显示加锁1.3 原子的TestAndSet1.4 版本号机制 二、 多个相关对象的一致性2.1 最大努力实现2.2 2PC && TCCC2.3.基于可靠消息的一致性方案2.4.Saga事务 三、…

HNCTF-PWN

1.ez_pwn 直接看危险函数&#xff0c;不能溢出&#xff0c;只能覆盖ebp。 后面紧接的又是leave,ret 很明显是栈迁移&#xff0c;通过printf打印出ebp&#xff0c;通过偏移计算出栈地址。 通过gdb调试&#xff0c;偏移是0x38 以下是payload&#xff1a; from pwn import * #i…