第九章Python语言高阶加强-面向对象篇

目录

一.初始对象

二.成员方法

1.成员变量和成员方法

三.类和对象

四.构造方法

五.其他内置方法(魔术方法)

1.__str__字符串方法

2.__lt__小于符号比较方法

3.__le__小于等于比较符号方法

4.__eq__比较运算符实现方法

六.封装

七.继承

1.继承基本语法

2.复写和使用父类成员

八.类型注解

1.函数(方法)类型的注解

2.Union类型

九.多态


此章节是Python的面向对象篇章,主要讲解,"初始对象、成员方法、类和对象、构造方法、其他内置方法、封装、继承、类型注解、多态"。其中:"封装"、"继承"、"多态"是面向对象的三大特征。

一.初始对象

在程序中是可以做到和生活中那样,设计表格、生产表格、填写表格的组织形式的。

初始面向对象代码示例如下:

运行结果:

总结:

1.生活中或是程序中,我们都可以使用设计表格、生产

表格、填写表格的形式组织数据

2.进行对比,在程序中

  • 设计表格,称之为:设计类(class)
  • 打印表格,称之为:创建对象
  • 填写表格,称之为:对象属性赋值

二.成员方法

类的定义和使用

在上一节中,我们简单了解到可以使用类去封装属性,并基于类创建出一个个的对象来使用。

现在我们来看看类的使用语法:

  • class是关键字,表示要定义类了
  • 类的属性,即定义在类中的变量(成员变量)
  • 类的行为,即定义在类中的函数(成员方法)

创建类对象的语法:

1.成员变量和成员方法

从上图可以看出,类中:

  • 不仅可以定义属性用来记录数据
  • 也可以定义函数,用来记录行为

其中:

  • 类中定义的属性(变量),我们称之为:成员变量
  • 类中定义的行为(函数),我们称之为:成员方法

注:

从这个章节开始,定义类内部的函数我们称为"方法",而不是函数。

成员方法的定义语法:

在类中定义成员方法和定义函数基本一致,单仍有细微区别:

可以看到,在方法定义的参数列表中,有一个:self关键字

self关键字是成员方法定义的时候,必须填写的。

  • 它用来表示类对象自身的意思
  • 当我们使用类对象调用方法的是,self会自动被python传入
  • 在方法内部,想要访问类的成员变量,必须使用self

注意事项:

self关键字,尽管在参数列表中,但是传参的时候可以忽略它。

如:

可以看到,在传入参数的时候,self是透明的,可以不用理会它。

成员变量和成员方法(self)的演示案例如下:

总结:

1.类是由哪两部分组成呢?

类的属性,称之为:成员变量

类的行为,称之为:成员方法

注意:函数是写在类外的,定义在类内部,我们都称之为方法。

2.类和成员方法的定义语法

3.self的作用

  • 表示类对象本身的意思
  • 只有通过self,成员方法才能访问类的成员变量
  • self出现在形参列表中,但是不占用参数位置,无需理会

三.类和对象

注:

现实世界的事物也有属性和行为,类也有属性和行为。

使用程序中的类,可以完美的描述现实世界的事物

类和对象

基于类创建对象的语法:对象名 = 类名称()

为什么非要创建对象才能使用呢?

类只是一种程序内的"设计图纸"需要基于图纸生产实体(对象),才能正常工作

这种思想套路,我们称之为:面向对象编程

注:这就是面向对象编程,设计类,基于类创建对象,由对象做具体的工作

类和对象的代码演示如下:

总结:

1.现实世界的事物由什么组成?

  • 属性
  • 行为

类也可以包含属性和行为,所以使用类描述现实世界事物是非常合适的

2.类和对象的关系是什么?

类是程序中的"设计图纸'

对象是基于图纸生产的具体实体

3.什么是面向对象编程?

面向对象编程就是,使用对象进行编程,

即,设计类,基于类创建对象,并使用对象来完成具体的工作

四.构造方法

由于上图这样的给对象赋值的代码太过于繁琐和重复,这样

不利于代码的管理,因此Python提供了"构造方法",由这个方法进行类内部赋值,这样减少了代码的重复性并且利于程序维护。

构造方法

Python类可以使用:_ init _()方法,称之为构造方法。

可以实现:

  • 在创建类对象(构造类)的时候,会自动执行。
  • 在创建类对象(构造类)的时候,将传入参数自动传递给__init__方法使用。

第一种:构造器使用代码如下:

注:

  • 构建类时传入的参数会自动提供给__init__方法
  • 构建类的时候__init__方法会自动执行

第二种:构造器使用如下:

注:

这种方式的构造方法,不在类中定义成员变量,而是在构造器中定义变量并且赋值。

构造方法的注意事项:

  • 重要的事情说三遍,构造方法名称: init init

_ init _,千万不要忘记init前后都有2个下划线

  • 构造方法也是成员方法,不要忘记在参数列表中提供:self
  • 在构造方法内定义成员变量,需要使用self关键字
  • 这是因为:变量是定义在构造方法内部,如果要成为成员变量,需要用self来表示。

总结:

1.构造方法的名称是:

_init _,注意init前后的2个下划线符号

2.构造方法的作用:

  • 构建类对象的时候会自动运行
  • 构建类对象的传参会传递给构造方法,借此特性可以给成员变量赋值

3.注意事项:

  • 构造方法不要忘记self关键字
  • 在方法内使用成员变量需要使用self

五.其他内置方法(魔术方法)

上文学习的__init__ 构造方法,是Python类内置的方法之一。

这些内置的类方法,各自有各自特殊的功能,这些内置方法我们称之为:魔术方法

1.__str__字符串方法

当类对象需要被转换为字符串之时,会输出如上结果(内存地址)

注:内存地址没有多大作用,我们可以通过__str__方法,控制类转换为字符串的行为。

__str__字符串方法代码演示如下:

注:

  • 方法名__str__
  • 返回值:字符串
  • 内容:自行定义

2.__lt__小于符号比较方法

直接对2个对象进行比较是不可以的,但是在类中实现__lt__ 方法,即可同时完成:小于符号 和 大于符号 2种比较

__lt__魔术方法代码演示如下:

  • 方法名:lt
  • 传入参数:other,另一个类对象
  • 返 回 值:True 或 False
  • 内容:自行定义

3.__le__小于等于比较符号方法

魔术方法:__le__可用于:<=、>=两种比较运算符上。

__le__方法代码演示如下:

  • 方法名:le
  • 传入参数:other,另一个类对象
  • 返 回 值:True 或 False
  • 内容:自行定义

4.__eq__比较运算符实现方法

  • 不实现__eq__方法,对象之间可以比较,但是是比较内存地址,也即是:不同对象==比较一定是False结果。
  • 实现了__eq__方法,就可以按照自己的想法来决定2个对象是否相等了。

总结:

六.封装

面向对象的三大特性

面向对象编程,是许多编程语言都支持的一种编程思想。

简单理解是:基于模板(类)去创建实体(对象),使用对象完成功能开发。

面向对象包含3大主要特性:

  • 封装
  • 继承
  • 多态

私有成员

既然现实事物有不公开的属性和行为,那么作为现实事物在程序中映射的类,也应该支持。

类中提供了私有成员的形式来支持。

  • 私有成员变量
  • 私有成员方法

定义私有成员的方式非常简单,只需要:

私有成员变量:变量名以_ _开头(2个下划线)

私有成员方法:方法名以_ _开头(2个下划线)

即可完成私有成员的设置

使用私有成员

总结:

1.封装的概念是指?

将现实世界事物在类中描述为属性和方法,即为封装。

2.什么是私有成员?为什么需要私有成员?

现实事物有部分属性和行为是不公开对使用者开放的。同样在类中描述属性和方法的时候也需要达到这个要求,就需要定义私有成员了

3.如何定义私有成员?

成员变量和成员方法的命名均以_ _作为开头即可

4.私有成员的访问限制?

  • 类对象无法访问私有成员
  • 类中的其它成员可以访问私有成员

七.继承

由于事物之间都存在迭代,往往这些迭代的过程都会依据以前的基础上进行更新的过程。而程序同样也有这种相似的过程。这种过程我们称作"继承"。

1.继承基本语法

继承的语法格式如下:

继承分为:单继承和多继承

使用如图语法,可以完成类的单继承。

继承表示:将从父类那里继承(复制)来成员变量和成员方法(不含私有)

单继承演示代码如下:

多继承代码演示如下:

注:

由于类的语法特点,你必须得在后面写内容,这个时候若不想写任何语句,可以使用pass关键字,它代表空

多继承注意事项:

多个父类中,如果有同名的成员,那么默认以继承顺序(从左到右)为优先级。

即:先继承的保留,后继承的被覆盖

总结:

1.什么是继承?

继承就是一个类,继承另外一个类的成员变量和成员方法

语法:

子类构建的类对象,可以

  • 有自己的成员变量和成员方法
  • 使用父类的成员变量和成员方法

2.单继承和多继承

单继承:一个类继承另一个类

多继承:一个类继承多个类,按照顺序从左向右依次继承

多继承中,如果父类有同名方法或属性,先继承的优先级高于后继承

3.pass关键字的作用是什么

pass是占位语句,用来保证函数(方法)或类定义的完整性,表示无内容,空的意思

2.复写和使用父类成员

复写:子类继承父类的成员属性和成员方法后,如果对其"不满意",那么可以进行复写

即:在子类中重新定义同名的属性或方法即可。

调用父类同名成员

一旦复写父类成员,那么类对象调用成员的时候,就会调用复写后的新成员

如果需要使用被复写的父类的成员,需要特殊的调用方式:

方式1:

  • 调用父类成员

使用成员变量:父类名.成员变量

使用成员方法:父类名.成员方法(self)

方式2:

  • 使用super()调用父类成员

使用成员变量:super().成员变量

使用成员方法:super().成员方法()

总结:

1.复写表示

对父类的成员属性或成员方法进行重新定义

2.复写的语法:

在子类中重新实现同名成员方法或成员属性即可

3.在子类中,如何调用父类成员

方式1:

  • 调用父类成员

使用成员变量:父类名.成员变量

使用成员方法:父类名.成员方法(self)

方式2:

  • 使用super()调用父类成员

使用成员变量:super().成员变量

使用成员方法:super().成员方法()

注意:只可以在子类内部调用父类的同名成员,子类的实体类对象调用默认是调用子类复写的

八.类型注解

由图,引出类型注解。因为PyCharm无法通过代码确定应传入什么类型,因此我们需要"类型注解"。

类型注解的概念:

Python在3.5版本的时候引入了类型注解,以方便静态类型检查工具,IDE等第三方工具。

类型注解:在代码中涉及数据交互的地方,提供数据类型的注解(显式的说明)。

主要功能:

  • 帮助第三方IDE工具(如PyCharm)对代码进行类型推断,协助做代码提示
  • 帮助开发者自身对变量进行类型注释

类型注解支持如下:

  • 变量的类型注解
  • 函数(方法)形参列表和返回值的类型注解

第一种方式:类型注解的语法如下:

第一种方法:类型注解代码演示如下:

第二种方式:类型注解语法如下:

第二种方法:类型注解代码演示如下:

注:

类型注解的限制

类型注解主要功能在于:

  • 帮助第三方IDE工具(如PyCharm)对代码进行类型推断,协助做代码提示
  • 帮助开发者自身对变量进行类型注释(备注)

并不会真正的对类型做验证和判断,

也就是,类型注解仅仅是提示性的,不是决定性的

如图代码,是不会报错的哦。

总结:

1.什么是类型注解,有什么作用?

在代码中涉及数据交互之时,对数据类型进行显式的说明,可以帮助:

  • PyCharm等开发工具对代码做类型推断协助做代码提示
  • 开发者自身做类型的备注

2.类型注解支持:

  • 变量的类型注解
  • 函数(方法)的形参和返回值的类型注解

3.变量的类型注解语法

  • 语法1: 变量:类型
  • 语法2:在注释中,#type:类型

4.注意事项

  • 类型注解只是提示性的,并非决定性的。数据类型和注解类型无法对应也不会导致错误

1.函数(方法)类型的注解

函数和方法的形参类型注解语法:

函数(方法)类型的注解代码演示案例:

返回值注解的代码演示如下:

总结:

1.函数(方法)可以为哪里添加注解?

  • 形参的类型注解
  • 返回值的类型注解

2.函数(方法)的类型注解语法?

注:返回值类型注解的符号使用:->

2.Union类型

Union类型演示代码示例如下:

总结:

1.什么是Union类型?

使用Union可以定义联合类型注解

2.Union的使用方式

  • 导包:from typingimport Union
  • 使用:Union[类型,... 类型]

九.多态

多态的概念:多态,指的是:多种状态,即完成某个行为时,使用不同的对象会得到不同的状态。

注:上图是多态的示例,从此可以得出"同样的行为(函数),传入不同的对象,得到不同的状态"

多态演示代码如下:

抽象类(接口)

抽象类就好比定义一个标准,

包含了一些抽象的方法,要求子类必须实现。

抽象类(接口)代码演示示例如下:

运行结果:

总结:

1.什么是多态?

多态指的是,同一个行为,使用不同的对象获得不同的状态。如,定义函数(方法),通过类型注解声明需要父类对象,实际传入子类对象进行工作,从而获得不同的工作状态

2.什么是抽象类(接口)

包含抽象方法的类,称之为抽象类。抽象方法是指:没有具体实现的方法(pass),称之为抽象方法

3.抽象类的作用

多用于做顶层设计(设计标准),以便子类做具体实现。

也是对子类的一种软性约束,要求子类必须复写(实现)父类的一些方法并配合多态使用,获得不同的工作状态。

相关推荐
一路向北North22 分钟前
IDEA加载项目时依赖无法更新
java·ide·intellij-idea
小萌新上大分1 小时前
SpringCloudGateWay
java·开发语言·后端·springcloud·springgateway·cloudalibaba·gateway网关
PacosonSWJTU2 小时前
python基础-13-处理excel电子表格
开发语言·python·excel
froginwe112 小时前
Perl 条件语句
开发语言
直视太阳2 小时前
springboot+easyexcel实现下载excels模板下拉选择
java·spring boot·后端
Code成立3 小时前
《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》第2章 Java内存区域与内存溢出异常
java·jvm·jvm内存模型·jvm内存区域
啥都鼓捣的小yao3 小时前
利用C++编写操作OpenCV常用操作
开发语言·c++·opencv
灼华十一3 小时前
Golang系列 - 内存对齐
开发语言·后端·golang
一 乐3 小时前
实验室预约|实验室预约小程序|基于Java+vue微信小程序的实验室预约管理系统设计与实现(源码+数据库+文档)
java·数据库·微信小程序·小程序·毕业设计·论文·实验室预约小程序
程序媛学姐3 小时前
SpringRabbitMQ消息模型:交换机类型与绑定关系
java·开发语言·spring