[01-03-03].第15节:面向对象 - 三大特征
人工智能学习大纲
一、面向对象的三大特性:
面向对象编程:简单理解是:基于模板(类)去创建实体(对象),最终使用对象完成功能开发,它具有封装、继承和多态的特征
1.1.封装:
a.封装介绍:
- 1.封装表示的是,将现实世界事物的:
属性和行为
,封装到类中
,描述为:成员变量和成员方法
,从而完成程序对现实世界事物的描述
- 2.
封装对用户隐藏的属性和行为
- 现实世界中的事物,有属性和行为,但是不代表这些属性和行为都是开放给用户使用的,就比如一台手机的功能,有的用户就可以使用,有的是不对用户开放的
- 现实世界中的事物,有属性和行为,但是不代表这些属性和行为都是开放给用户使用的,就比如一台手机的功能,有的用户就可以使用,有的是不对用户开放的
- 3.
私有成员:在类中提供仅供内部使用的属性和方法,而不对外开放(类对象无法使用)
- 作为现实事物在程序中
映射的类
中提供了私有成员
的形式来支持:私有成员变量
和`私有成员方法 - 定义私有成员的方式非常简单,只需要遵守下面的规则即可:
- 私有成员变量:变量名
以__开头
(2个下划线) - 私有成员方法:方法名
以__开头
(2个下划线)
- 私有成员变量:变量名
- 私有方法无法直接被类对象使用
- 私有变量无法赋值,也无法获取值
- 私有成员
无法被类对象使用
,但是可以被其它的成员使用
- 作为现实事物在程序中
b.封装的使用:
1.2.继承:
a.语法:
class 类名(父类名字):
类内容体
- 继承分为:
单继承和多继承
,继承表示:将从父类那里继承(复制)成员变量和成员方法(不含私有)
b.单继承:
c.多继承:
1、语法:
- 1.Python的类之间也
支持多继承
,即一个类,可以继承多个父类
class 类名(父类1,父类2,父类3...........):
类的内容体
2、实例化对象测试:
3、.说明:
- 1.多个父类中,
如果有同名的成员,那么默认以继承顺序(从左到右)为优先级
。即:先继承的保留,后继承的被覆盖
- 2.
pass关键字
的作用是:pass是占位语句,用来保证函数(方法)或类定义的完整性,表示无内容,空的意思
d.复写:
1、概念:
- 1.子类继承父类的成员属性和成员方法后,如果对其“不满意”,那么可以进行复写。即:在子类中重新定义同名的属性或方法即可
2、调用父类同名成员
- 1.
一旦复写父类成员,那么类对象调用成员的时候,就会调用复写后的新成员
- 2.如果需要使用被复写的父类的成员,需要特殊的调用方式
- 方式1:调用父类成员
- 使用成员变量:
父类名.成员变量
- 使用成员方法:
父类名.成员方法(self)
- 使用成员变量:
- 方式2:使用
super()
调用父类成员- 使用成员变量:
super().成员变量
- 使用成员方法:
super().成员方法()
- 使用成员变量:
- 方式1:调用父类成员
1.3.多态:
a.定义:
- 1.多态:
指的是多种状态,即完成某个行为时,使用不同的对象会得到不同的状态
- 2.多态
常作用在继承关系上
.。比如函数(方法)形参声明接收父类对象,实际传入父类的子类对象进行工作。即:以父类做定义声明,以子类做实际工作,用以获得同一行为, 不同状态
b.举例:
- 1.如下图所示:
同样的行为(函数),传入不同的对象,得到不同的状态
c.抽象类:
- 1.如上图所示中,父类Animal的speak方法,是空实现,这种设计的含义是:父类用来确定有哪些方法和具体的方法实现,由子类自行决定,
这种写法,就叫做抽象类(也可以称之为接口)
- 抽象类:含有抽象方法的类称之为抽象类
- 抽象方法:
方法体是空实现的(pass)称之为抽象方法
- 2.为何使用抽象类(接口):提出标准后,不同的厂家各自实现标准的要求
- 3.抽象类
多用于做顶层设计(设计标准)
,以便子类做具体实现。也是对子类的一种软性约束,要求子类必须复写(实现)父类的一些方法,并配合多态使用,获得不同的工作状态
二、类型注解:
2.1.为何需要类型注解:
- 1.在PyCharm中编写代码,我们经常能够遇到如下提示,这是因为PyCharm确定这个对象,是list类型:
- 2.当自己定义PyCharm时,不会再有任何提示了,这是因为PyCharm不确定func是什么类型:
因为PyTharm无法通过代码确定应该传入什么类型,需要使用类型注解进行实现提示:
2.2.类型注解定义:
- 1.Python在3.5版本的时候引入了
类型注解
,以方便静态类型检查工具,IDE等第三方工具
- 2.类型注解:在代码中
涉及数据交互
的地方,提供数据类型的注解(显式的说明)
2.3.类型注解功能:
- 1.帮助第三方IDE工具(如PyCharm)对代码进行类型推断,协助做代码提示
- 2.帮助开发者自身对变量进行类型注释
- 4.类型注解支持:
- 变量的类型注解
- 函数(方法)形参列表和返回值的类型注解
2.4.类型注解的语法:
a.变量的类型注解:
a1.第一种方式:语法:变量: 类型
- 1.基础数据类型注解:
- 2.类对象类型注解
- 3.基础容器类型注解
- 4.容器类型详细注解:
注意:
元组类型设置类型详细注解,需要将每一个元素都标记出来
字典类型设置类型详细注解,需要2个类型,第一个是key第二个是value
- 5.在注释中进行类型注解,语法是:
# type: 类型
b.函数(方法)的类型注解:
b1.函数(方法)的类型注解 - 形参注解
- 1.现存现象分析:
- 2.函数和方法的形参类型注解语法:
b2.函数(方法)的类型注解 - 返回值注解:
- 1.语法:
- 2.举例:
b3.Union类型:
- 1.问题分析:
使用
Union[类型, ......, 类型]
可以定义联合类型注解
- 2.使用Union的时候,需要先导包:
- 3.Union联合类型注解,在变量注解、函数(方法)形参和返回值注解中,均可使用:
三、综合案例:
3.1.需求:
- 1.某公司,有2份数据文件,现需要对其进行分析处理,计算每日的销售额并以柱状图表的形式进行展示
- 1月份数据是普通文本,使用逗号分割数据记录,从前到后分别是(日期,订单id,销售额,销售省份)
- 2月份数据是JSON数据,同样包含(日期,订单id,销售额,销售省份)
- 1月份数据是普通文本,使用逗号分割数据记录,从前到后分别是(日期,订单id,销售额,销售省份)
3.2.分析:
3.3.编码:
a.实现步骤:
b.编码实现:
-
1.第一步:
-
2.定义抽象类:
-
3.编写实现类,读取普通文件:
-
4.编写实现类,读取json文件: