|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函数就能看出,逗号“,”前的是不是逗号“,”后的类型。所以,大家现在懂数据类型与类的关联性原理了吧
总结
好了,今天的内容到此结束。实在是写不动了,下次再努力吧
下节课,我们将学习类的最后一讲:拓展篇,大家敬请期待!如有不懂,别忘了问我哟!下期见~~~
【制作不易,别忘了一圈三连,点个关注!!!】
相关文章:
|Python新手小白中级教程|第二十八章:面向对象编程(类定义语法私有属性类的继承与多态)(4)
文章目录 前言一、类定义语法二、私有方法和私有属性1.私有属性2.私有方法 三、类“继承”1.初识继承2.使用super函数调用父类中构造的东西 四、类“多态”1.多态基础2.子类不同形态3.使用isinstance函数与多态结合判断类型 总结 前言 大家好,我是BoBo仔吖…...
vue项目基于WebRTC实现一对一音视频通话
效果 前端代码 <template><div class"flex items-center flex-col text-center p-12 h-screen"><div class"relative h-full mb-4 fBox"><video id"localVideo"></video><video id"remoteVideo">…...
web 基础之 HTTP 请求
web 基础 网上冲浪 就是在互联网(internet)上获取各种信息,进行工作,或者娱乐,他的英文表示surfing the Internet,因 “surfing”d的意思是冲浪,即成为网上冲浪,这是一种形象说法, 也是一个非…...
嵌入式 - GPIO编程简介
An Introduction to GPIO Programming By Jeff Tranter Wednesday, June 12, 2019 编者按:本 2019 年博客系列是 ICS 最受欢迎的系列之一,现已更新(2022 年 12 月),以确保内容仍然准确、相关和有用。 本博客是 Integr…...
8种区块链开发者必须知道的顶级编程语言!
我来问你一个问题:请说出一种技术,它以去中心化、不可篡改和透明性等核心特征席卷了全球。 这个问题的答案是,当然是区块链,它在近些年进入大家的视野并颠覆了工商业,没有任何其他技术能够做到这一点。 预计从2020年…...
十三、Redis哨兵模式--Sentinel
上一篇介绍了Redis中的主从复制。我们知道Redis主从中一般只有主节点对外提供写操作,如果主节点发生故障,为了保证Redis的可用性,这时就要在可用的slave节点中,挑选一个作为主节点。这种切换操作如果是人为的操作,那么…...
[力扣题解]1005. K 次取反后最大化的数组和
题目:1005. K 次取反后最大化的数组和 思路 贪心法; 用绝对值大小排序,自己写一个比较函数, static bool compare(int a, int b) {return abs(a) > abs(b); }注意这样写出来是降序排列; 代码 class Solution {…...
Web UI自动化测试--PO模式
没有PO实现的测试用例的问题: 重用性低:登录功能重复可维护性差:数据和代码混合可读性差:元素定位方法杂乱(id、xpath、css混杂)可读性差:不易识别操作的含义(特别是css和xpath语法)可维护性差:如果某个元素的属性改了,你要更改多次PO(Page Object Model)页面对象模型…...
Python进阶之-反射机制详解
✨前言: 什么是反射? Python中的“反射”是一个编程术语,它指的是程序在运行时能够检查和操作其自身状态的能力,特别是通过名称(通常是字符串)来访问对象的属性、方法和其他组成部分。这种机制允许代码动态…...
day05-面向对象内存原理和数组
day05 面向对象内存原理和数组 我们在之前已经学习过创建对象了,那么在底层中他是如何运行的。 1.对象内存图 1.1 Java 内存分配 Java 程序在运行时,需要在内存中分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域…...
从头理解transformer,注意力机制(下)
交叉注意力 交叉注意力里面q和KV生成的数据不一样 自注意力机制就是闷头自学 解码器里面的每一层都会拿着编码器结果进行参考,然后比较相互之间的差异。每做一次注意力计算都需要校准一次 编码器和解码器是可以并行进行训练的 训练过程 好久不见输入到编码器&…...
ORA-609频繁出现在alert.log,如何解决?
ORA-609就alertlog中比较常见的一个报错,虽然并没有太大的影响,但是频繁的出现在alert log也是很让人厌烦的事情,本文介绍如何排查解决ORA-609问题。 1.ORA-609官方定义 could not attach to incoming connection Cause Oracle process cou…...
JVM 类加载机制
JVM 类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程。 加载 加载是类加载过程中的一个阶段,这个阶段会在内存中生成一个代表这个类的 java.lang.class 对…...
亲测-wordpress文章实时同步发布修改删除多个站点的WP2WP插件
一款将wordpress文章同步到其他WordPress网站的插件,通过这款插件,可以保持不同博客之间文章发布、修改、删除的同步。 安装步骤: 主站和分站都要上传这个插件 1.把插件上传到wp-content\plugins解压出来wp2wp文件夹,然后启用插…...
npm无法安装node-sass 的问题
安装 node-sass 的问题呈现:4.9.0版本无法下载 Downloading binary from https://github.com/sass/node-sass/releases/download/v4.9.0/win32-x64-72_binding.node Cannot download "https://github.com/sass/node-sass/releases/download/v4.9.0/win32-x64-…...
springboot 引入第三方bean
如何进行第三方bean的定义 参数进行自动装配...
安装Nginx
如果没有gcc环境,需要安装gcc yum install gcc-c安装依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel工作目录 mkdir /opt/nginx && cd /opt/nginx下载安装包 wget http://nginx.org/download/nginx-1.32.1.tar.gz解压安装包…...
爬虫工具you-get
you-get是一个简单易上手的爬虫小工具,可以从网络中爬取多媒体信息,包括图片、音频和视频。you-get的github项目地址为:https://github.com/soimort/you-get 一、安装 以下为相关依赖,需要分别安装: Python 3 (必须…...
hal_stm32_RTC函数
1设置当前时间: 调用 HAL_RTC_SetTime 来设置小时、分钟、秒和亚秒。 调用 HAL_RTC_SetDate 来设置年、月、日和星期。 HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format); HAL_StatusTypeDef HAL_RTC_SetDat…...
【大数据·Hadoop】从词频统计由浅入深介绍MapReduce分布式计算的设计思想和原理
一、引入:词频统计问题 假如我们有一亿份文档,需要统计这一亿份文档的词频。我们会怎么做,有以下思路 使用单台PC执行:能不能存的下不说,串行计算,一份一份文档读,然后进行词频统计࿰…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
