手机版本
Python面向对象
面向对象入门
对象编程体验
一款简单自动运行小游戏模拟:在一维的地图上,有一只虫子和一只蚂蚁。每一次他们都走过一个-3,-2,2,3个随机单位的距离(选定走法,若达到地图边界则放弃移动)。当蚂蚁、虫子处于同一位置时,蚂蚁吃掉虫子,程序结束。
PO
虫子的初始位置
蚂蚁的初始位置
进入循环(条件为蚂蚁和虫子不在同一位置)
依照规则,蚂蚁和虫子移动位置
直到蚂蚁和虫子走到同一位置,程序结束
OO
游戏中的对象有:地图、虫子、蚂蚁
地图是一维的,只需要记录虫子和蚂蚁的位置
蚂蚁和虫子知道自己的位置
蚂蚁和虫子能按规则移动
定义地图、蚂蚁、虫子三个类
主程序中实例化它们,并通过对象间的交互来完成游戏的模拟
理解对象
对象可以指自然界中的任何事物
计算机为解决某个领域问题所使用的事物(自然界中的事物的模型化)
事物(对象)具有自身的特征或能力
计算机中的对象具有解决问题所需的特征或能力
对象优越性
封装
将模型的特征和能力打包在一起
模型的改变由模型自身来完成,就像自然界的事物一样
隐藏模型的细节,外界只能使用他,而不必/不能改变他
继承
符合自然界的分类规律
快速的代码重用
多态
子类可以继承父类的特征与能力,还可以通过自定义来修改其特征与能力
鸭子类型(duck typing)
组合
一个模型可以由其他的模型组成
课程简介
培训对象
对Python面向对象编程感兴趣
已掌握基础的Python面向过程编程
用Python自主开发大、中型应用系统
有未来从事Python相关开发职业目标的
技能目标
了解面向对象编程的基本知识
掌握Python语言中类的定义与使用方法
掌握Python中类的属性与方法及其应用
掌握Python中类继承与多态、方法重载
会用继承和组合来完成项目的面向对象分析和代码实现
怎样学习
1.掌握Python基本语法及顺序、选择、循环基本程序的编写技能
2.注意掌握面向对象的基础知识
3.听课及时做笔记,供复习
4.课后多做实践,理论联系实际才是最好的学习方式
5.加入一些群、论坛等,帮人解决问题,提升自己
面向对象与面向过程
产生背景
科学计算为目标的必然产物
鸡兔同笼
1.先假设全部为鸡(兔),计算出腿数
2.然后算出腿数量差
3.得出鸡(兔)数量
4.计算出另一种动物的数量
软件应用领域的扩张和系统膨胀之后应运而生
编程方法
自顶向下
自底向上
代码主体结构
程序=数据(变量)+算法(函数/过程)
程序=对象+交互
数据操作主体
由函数/过程进行加工与展现
在对象的方法中加工与展现
模拟方法
通过函数/过程操纵表现世界的数据与状态
把世界描绘成具有主动性的对象之间交互
编程思维
搞清处理数据的步骤
面向对象分析
运行效率
较高
稍低
定义和使用类
最简类定义
类实例化
类与实例之间关系
定义类就是建立模型(模子/印章)
实例化类就是建立真实事物(产品/印章印出的图案)
有特征和能力的类
特征/属性,是类自身包含或知道的数据
能力,以方法体现,是类具有能动性的体现
实例化步骤
调用new()方法创建实例
new()方法自动从object继承
调用init()方法对其初始化
init()方法在类中定义
添加类说明(docstring)
紧跟类名行之后,以三引号包围的字符串
查看类说明
类名.doc
help(类名)
新式类与经典类
Python 2.x版本
默认为是经典类
继承object为新式类
Python 3.x版本
统一为新式类不用继承object
区别
经典类继承为深度优先
新式类继承为广度优先
课后思考
类和实例是什么关系?
类的属性和方法分别代表什么?
类实例化的基本步骤是什么?
描述对象的特征
实例属性
类被实例化以后才会具有的属性
一般在init()方法中创建并初始化
直接使用即定义:self.<属性名>
引用方法:self.<属性名>
self用来代表类的实例的
类外用实例名.属性名方式定义和引用
相同类的不同实例其实例属性是不相关的
一般不建议在init()方法之外中创建和初始化实例属性
一般不推荐类外定义和修改,修改可以单独定义方法
类属性
类定义后就存在,而且不需要实例化
类属性使得相同类的不同实例共同持有相同变量
私有属性
不提供限制属性访问的关键字(无法限制类的各种属性在类外直接访问)
使用__开头的变量名加以标志,只有类对象自己能访问
使用_开头的变量名加以标志,应该只有类对象及其子类能访问(非强制性)
特殊属性
保存对象的元数据
doc
name
dict
module
base
作业
定义一个类Box,具有实例属性长度(length)、宽度(width)、高度(height)。具有私有属性体积(由长、宽、高计算得来),并且它的每个实例可以知道它被实例化的数量。然后实例化它们五次,并输出每个实例的所有属性。
让对象具有能动性
类的方法的定义
def fun_name(self,…): pass
其中的参数self代表类的实例,在调用方法时由系统自动提供。
方法定义时必须指明self参数
类的方法的调用
与普通的函数调用类似
在类的内部调用:self.<方法名>(参数列表)
在类的外部调用:<实例名>.<方法名>(参数列表)
注:以上两种调用方法中,提供的参数列表中都不用包括self
类内方法相互调用
在一个类的内部方法之间是可以相应调用的
调用方法同上面所述的在类的内部调用方法
构造方法及其作用
构造方法就是前面课程提到和使用的init()方法
构造方法的作用就是在类实例化时初始化实例
init()方法就是类实例化的第二步自动调用的函数
注意其方法名是固定的,但其参数同普通方法一样,至少应带有self参数
初始化实例包括:定义和初始化实例属性;或调用类的一些方法
构造方法可以带有除self外的其它各种参数(关键字参数、默认参数、用元组收集参数、用字典收集关键字参数等);可以达到在实例化类时,为相应的属性传入指定的值。
提醒
本节课所定义的都是类的实例方法,和实例属性一样,必须进行类实例化之后,才能存在和调用它们。
这里使用的是Python3.x版本,print是一个函数。
作业
修改上次课中定义的类Box,要求其具有:访问私有属性(体积)的方法添加颜色属性(_color)和设置与获取Box的颜色的方法添加打开和关闭盒子(Box)的方法,并且限制Box打开(关闭)之后,再次调用打开(关闭)方法会给予提示;即不能重复打开与关闭。在主程序中实例化并进行测试。
深入类的属性
同名的类属性与实例属性
以实例名.属性名引用时,优先引用实例属性
以类名.属性名引用时,只能引用类属性
属性访问的特殊方法(反射)
提供用字符串来操作类的属性/方法的方式
主要工具函数
hasattr(obj_bame,'属性名')
setattr(obj_name,'属性名',值)
getattr(obj_name,'属性名')
属性包装
将方法包装成属性,以隐藏相关实现。
控制属性的类型或范围
虚拟属性(由其它属性处理后得来)
三种属性操作
可读:@property
可写:@<property-name>.setter
可删:@<property-name>.deleter
描述符
将实现特殊协议方法的类作为另一个类的类属性
用来拦截和控制属性访问并可以重复使用
协议方法
get()
set()
delete()
分类
数据描述符(实现全部协议方法)
非数据描述符(实现部分协议方法)
说明:所有类成员函数都是非数据描述符
同名的实例属性和非数据描述符(以方法为例)访问优先级
注意:只能在新式类中使用
call()让类的实例如函数一样可调用
作业
修改上节课的作业中定义的类:1.使用属性包装器将私有属性_color包装为color(可读写)属性2.运用描述符在Box类中创建一个类属性(盒子六面的图案字符,只能为数字1-6)3.为其定义call(),当作为函数调用时,返回其体积
公众号:
IT入门
回复:py10
下载高清思维导图
学习python
http://dida100.com/it/
下载方式
高清思维导图下载
关注下方公众号
回复:“py10”
长按上方二维码即可关注
回复:“web01”领取
在线学免费学编程
http://dida100.com/it
长按2秒学代码学单词
👇戳原文:在线编程
有用就奖励个👍和在看呗~