第九章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.抽象类的作用

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

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

相关推荐
侠客行031714 小时前
Mybatis连接池实现及池化模式
java·mybatis·源码阅读
蛇皮划水怪14 小时前
深入浅出LangChain4J
java·langchain·llm
灰子学技术16 小时前
go response.Body.close()导致连接异常处理
开发语言·后端·golang
老毛肚16 小时前
MyBatis体系结构与工作原理 上篇
java·mybatis
风流倜傥唐伯虎16 小时前
Spring Boot Jar包生产级启停脚本
java·运维·spring boot
二十雨辰16 小时前
[python]-AI大模型
开发语言·人工智能·python
Yvonne爱编码16 小时前
JAVA数据结构 DAY6-栈和队列
java·开发语言·数据结构·python
Re.不晚16 小时前
JAVA进阶之路——无奖问答挑战1
java·开发语言
你这个代码我看不懂16 小时前
@ConditionalOnProperty不直接使用松绑定规则
java·开发语言
pas13617 小时前
41-parse的实现原理&有限状态机
开发语言·前端·javascript