|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.hqwc.cn/news/691517.html

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

相关文章

云南区块链商户平台:抓包技术自制开票工具(三)

前言 上节我们将登录的流程梳理完毕了&#xff0c;来到了本章重点&#xff0c;既然开发票就肯定要有以下参数&#xff1a; 原工具不支持识别历史记录&#xff0c;对于我们的小商店来说&#xff0c;开票的公司基本就是固定的几个&#xff0c;如果提供下拉支持选择将会大大降低…

【基于 PyTorch 的 Python 深度学习】6 视觉处理基础:卷积神经网络(1)

前言 文章性质&#xff1a;学习笔记 &#x1f4d6; 学习资料&#xff1a;吴茂贵《 Python 深度学习基于 PyTorch ( 第 2 版 ) 》【ISBN】978-7-111-71880-2 主要内容&#xff1a;根据学习资料撰写的学习笔记&#xff0c;该篇主要介绍了卷积神经网络的卷积层部分。 预&#xff1…

C++ | Leetcode C++题解之第76题最小覆盖子串

题目&#xff1a; 题解&#xff1a; class Solution { public:unordered_map <char, int> ori, cnt;bool check() {for (const auto &p: ori) {if (cnt[p.first] < p.second) {return false;}}return true;}string minWindow(string s, string t) {for (const au…

计算机网络实验3:路由器安全防控配置

实验目的和要求 理解标准IP访问控制列表的原理及功能理解CHAP、DHCP配置原理了解家用式无线路由配置方法实验项目内容 标准IP访问控制列表配置 CHAP验证路由器上配置DHCP网络地址转换NAT配置无线路由实现实验环境 1. 硬件&#xff1a;PC机&#xff1b; 2. 软件&#xff1a;W…

web入门——导航栏

本专栏内容代码来自《响应式web&#xff08;HTML5CSS3Bootstrap&#xff09;》教材。 导航栏 实现代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content&…

laravel8 导入 excel常见问题

上传xls 或 xlsx 文件后&#xff0c;文件解析为 zip 格式&#xff0c;输入正常情况&#xff0c;不影响解析 里面的内容 遇到解析内容&#xff0c;解析为空的情况&#xff0c;可能是 因为excel 存在多个 Sheet1 造成&#xff0c;服务器不能解析一个 Sheet1 的情况&#xff0…

验证搜索二叉树

目录 题目 方法一 思路 优化 方法二 思维误区 递归关系推导 代码实现 题目 98. 验证二叉搜索树 难度&#xff1a;中等 给你一个二叉树的根节点root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含…

RZ9692实训开发通信系统构建(含配置json配置文件)

实验名称 通信系统的构建 实验目的&#xff1a; 实现一个通信系统的构建&#xff0c;要求传输两路正弦波&#xff0c;和一路视频信号&#xff0c;要求在接受端完整接受正弦信号和视频信号。 一、实验原理&#xff1a; 数字通信系统的一般模型&#xff1a; 数字通信系统的一…

c 双向链表

图片 #include <stdio.h> #include <stdlib.h> #include <string.h>int main(void){ struct film{char name[20];int id;struct film *pre; //前向指针struct film *next; //后向指针 };struct film *headNULL;struct film *ls,*lspre,*work;in…

【HTTP下】总结{重定向/cookie/setsockopt/流操作/访问网页/总结}

文章目录 1.请求头2.cookie理解 3.vim跳转/搜索4.setsockopt被重用的意思 5.流操作5.1定位读取指针5.2ifstram::read() 6.总结6.1 百度搜索框搜索功能字符6.2请求uri请求和响应的第一行都有http版本请求内容里有GET /favicon.ico HTTP/1.1 6.3访问网页Fiddler抓包原理&#xff…

新iPadPro是怎样成为苹果史上最薄产品的|Meta发布AI广告工具全家桶| “碾碎一切”,苹果新广告片引争议|生成式AI,苹果倾巢出动

Remini走红背后&#xff1a;AI生图会是第一个超级应用吗&#xff1f;新iPadPro是怎样成为苹果史上最薄产品的生成式AI&#xff0c;苹果倾巢出动Meta发布AI广告工具全家桶&#xff0c;图像文本一键生成解放打工人苹果新iPadPro出货量或达500万台&#xff0c;成中尺寸OLED发展关键…