|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 = exp
        self.grade = grade
    
    def 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 = name
        self.__age = None
        print(self.__name,'生成成功!')
    def set_age(self,age):
        if not isinstance(age,int):#这里的函数isinstance是判断它括号内的两个参数中,参数1是否是参数2的类型,如果不是就执行下面的操作,通常作为条件使用
            print('输入的年龄必须是数字!')
            return False
        if age <= 0:
            print('年龄必须大于0!')
            return False
        self.__age = age
    def 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 = name

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

    def 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):
    pass

class Cat(Animal):
    pass

dog = 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函数就能看出,逗号“,”前的是不是逗号“,”后的类型。所以,大家现在懂数据类型与类的关联性原理了吧

总结

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

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

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

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

相关文章

RocketMQ学习笔记(一)

一、基本概念 生产者&#xff08;Producer&#xff09;&#xff1a;也称为消息发布者&#xff0c;是RocketMQ中用来构建并传输消息到服务端的运行实体&#xff0c;举例&#xff1a;发信者主题&#xff08;Topic&#xff09;&#xff1a;Topic是RocketMQ中消息传输和存储的顶层…

【全开源】Java知识付费教育付费资源付费平台公众号小程序源码

特色功能&#xff1a; 多样化的内容呈现&#xff1a;资源付费平台小程序支持图文、音视频、直播等多种形式的内容呈现&#xff0c;为用户提供了丰富的学习体验。直播课程&#xff1a;专家或讲师可以通过小程序进行在线授课&#xff0c;与用户实时互动&#xff0c;增强了学习的…

再有人说数字孪生大屏没有用,用这8条怼回去。

数字孪生大屏之所以受到欢迎&#xff0c;主要有以下几个原因&#xff1a; 实时数据可视化 数字孪生大屏可以将实时数据以直观的可视化形式展示出来&#xff0c;让用户能够一目了然地了解数据的状态和趋势。这样可以帮助用户更好地理解和分析数据&#xff0c;及时做出决策和调…

动态规划算法练习——计数问题

题目描述 给定两个整数 a 和 b&#xff0c;求 a 和 b 之间的所有数字中 0∼9 的出现次数。 例如&#xff0c;a1024&#xff0c;b1032&#xff0c;则 a 和 b 之间共有 9 个数如下&#xff1a; 1024 1025 1026 1027 1028 1029 1030 1031 1032 其中 0 出现 10 次&#xff0c;1 出现…

蓝桥杯-网络安全比赛(7)基础知识 HTTP、TTL、IP数据包、MSS、MTU、ARP、LLMNR、MDNS、NBNS。

1. IP中TTL值能够给我提供什么信息&#xff1f;2. IP头部中标志、13位偏移、32位源IP地址、目标IP、IP数据包格式&#xff0c;有多少字节3. IP头部中的16位标识是什么&#xff1f;4. MSS 和MTU分别有多大&#xff1f;5. 怎么获取路由IP信息&#xff1f;PING、NSLOOKUP、TRACERT…

day6Qt作业

人脸识别系统 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <opencv2/opencv.hpp> #include <iostream> #include <math.h> #include<opencv2/face.hpp> #include <vector> #include <map> #include <QMessag…

创建一个react项目(router,store,axios,antd)最后有项目地址

第一步&#xff1a;使用cra脚手架 创建项目 文档地址&#xff1a;Create React App 中文文档 npx create-react-app 你的项目名称 第二步&#xff1a;整理项目结构和删除多余代码 目标效果图&#xff1a; 在src目录下分别新建apis,assets,components,pages,router,store,ut…

重学JavaScript核心知识点(二)—— 详解Js中的模块化

详解Js中的模块化 1. 模块化的背景2. 来看一个例子3. 优雅的做法 —— 创建模块对象4. 模块与类&#xff08;class&#xff09;5. 合并模块6. 动态加载模块 1. 模块化的背景 JavaScript 在诞生之初是体积很小的&#xff0c;早期&#xff0c;它们大多被用来执行独立的脚本任务&…

C++初学者,使用命令行编绎C文件

今天在家里&#xff0c;闲来无事。又开始学习制作Helloworld! VStudio 版本众多&#xff0c;用哪个好呢&#xff0c;真是不好选择。今天就使用网上的大神&#xff1a;theoractice&#xff0c;制造的版本来学习C&#xff0c;我喜欢2013这个版本&#xff0c;真是太好用了。不但C…

Qt自定义控件--提升为

为什么要自定义控件 1&#xff0c;有复合小控件需要组合为一个整体控件时&#xff1b; 2&#xff0c;一个复合控件需要重复使用时&#xff1b; 实现 自定义控件文件 新增三个文件 关联不同组的控件 关联之前的准备工作 1&#xff0c;在主控件选择和子控件所有控件所在控件…

【一键录音,轻松转换:用Python打造个性化音频记录工具】

在数字化时代,音频记录已成为日常学习、工作和娱乐不可或缺的一部分。想象一下,只需简单按下几个键,即可随时随地捕捉灵感,记录会议要点,或是珍藏孩子的童言稚语。本文将引领您步入Python编程的奇妙世界,展示如何借助几个强大的库,构建一个既简单又实用的音频录制及转换…

第十二届蓝桥杯省赛真题 Java A 组【原卷】

文章目录 发现宝藏【考生须知】试题 A: 相乘试题 B: 直线试题 C : \mathrm{C}: C: 货物摆放试题 D: 路径试题 E: 回路计数试题 F : \mathrm{F}: F: 最少砝码试题 G: 左孩子右兄弟试题 H : \mathrm{H}: H: 异或数列试题 I \mathbf{I} I 双向排序试题 J : \mathrm{J}: J: 分…

如何快速展示专业:掌握类的基本概念-类/方法/关键字/变量/数据类型/注释

在李笑来的《财富自由之路》中提到一种初学者快速入门的学习方法&#xff1a;快速掌握最小必要知识。 关于Java的类&#xff0c;最少必要知识就是本文提到的基本概念&#xff0c;掌握了这些基本概念&#xff0c;就对类有了基本的了解&#xff0c;为后续的深入学习和沟通奠定了基…

Go编程语言的调试器Delve | Goland远程连接Linux开发调试(go远程开发)

文章目录 Go编程语言的调试器一、什么是Delve二、delve 安装安装报错cgo: C compiler "gcc" not found: exec: "gcc": executable file not found in $PATH解决 三、delve命令行使用delve 常见的调试模式常用调试方法todo调试程序代码与动态库加载程序运行…

真要这么卷?某国产大模型定价下调90%,百万 tokens 只需 1 元!

就在刚刚&#xff0c;国内明星AI公司——智谱AI官宣重磅炸弹&#xff1a; 将能力对标GPT3.5-Turbo的GLM-3的大模型API调用价格最高下调90%&#xff0c;价格仅为原来的十分之一&#xff01; 废话不多说&#xff0c;直接上图&#xff1a; 官网地址&#xff1a;https://open.big…

【SRC实战】前端脱敏信息泄露

挖个洞先 https://mp.weixin.qq.com/s/xnCQQCAneT21vYH8Q3OCpw “ 以下漏洞均为实验靶场&#xff0c;如有雷同&#xff0c;纯属巧合 ” 01 — 漏洞证明 一、前端脱敏&#xff0c;请求包泄露明文 “ 前端脱敏处理&#xff0c;请求包是否存在泄露&#xff1f; ” 1、获取验…

公有云Linux模拟UDP端口并抓包

目录 写在前面操作步骤服务端开启UDP端口并监听客户端连接Wireshark抓包查看 写在前面 关于具体的操作&#xff0c;请参考我的上一篇文章 公有云Linux模拟TCP三次挥手与四次握手&#xff08;Wireshark抓包验证版&#xff09; 在本文&#xff0c;仅介绍与上一篇不同的地方。 操…

STL中的优先级队列

目录 1.引言 2.简介 3.基本操作 4.实现原理 5.自定义优先级比较 6.相关题目 7.能特点 8.总结 1.引言 在C标准库中&#xff0c;优先级队列是一种非常有用的数据结构&#xff0c;它允许我们根据元素的优先级来对其进行排序和访问。这种数据结构在多种应用场景中都发挥着重…

Linux提权--第三方软件MYSQL数据库提权(WEB+本地)

免责声明:本文仅做技术交流与学习,非法搞事后果自负... 目录 靶场镜像: 过程: 手工: 下载mysql udf poc 进行编译. 进入数据库进行UDF导出 下载(上传) 创建do_system函数调用 探针(./LinEnum.sh),查找suid权限. 配合使用find调用执行 工具: 过程: 外连不上? 隧道出…

云器Lakehouse:Multi-Cluster弹性架构如何实现湖上高并发低延迟分析

导读 在当今快速发展的大数据时代&#xff0c;数据平台的性能和效率对于企业来说至关重要。云器Lakehouse的Multi-Cluster弹性架构为我们提供了一种全新的视角&#xff0c;以应对数据湖上高并发和低延迟分析的挑战。本文将深入探讨云器Lakehouse如何通过其独特的技术理念和架构…