当前课程知识点:Python 交互式程序设计导论 >  第6周 >  B 课程视频(平铺图片) >  理解对象

返回《Python 交互式程序设计导论》慕课在线视频课程列表

理解对象在线视频

理解对象

下一节:编程技巧

返回《Python 交互式程序设计导论》慕课在线视频列表

理解对象课程教案、知识点、字幕

欢迎回到Python交互式程序设计课程中

经过前面几节课的学习和项目实践

同学们对面向对象的程序设计理论应该有了一定的了解

今天呢我们将继续通过一个实际的案例深入理解

对象在程序中是如何运行的

好,下面咱们开始今天的内容

首先呢,我们还是对类和对象的基本概念

及二者之间的关系做一个回顾和总结

第一,类是同类别事物的抽象化表示,是对象的模板

也就是说,对象是按照类这个模板的定义来生成的

那么对象呢是封装状态和行为的综合的实体,是类的实例化

第二点,类是对象的抽象,对象是类的具体体现

类是抽象的,所以它不占内存空间,而对象是具体的,占用存储空间

其实简单的描述呢,类是一个定义,是一个模板

而对象是根据这个定义、这个模板产生的实体

这里呢,我贴了两张图片,是我很早以前非常喜欢的的一部电影

叫《黑客帝国》,那么大家请看右边这张图片

这是非常经典的一个数字雨的一个截图

什么叫数字雨啊,同学们可能记得

当年这个电影在推出的时候呢,这样一个画面当时是深入人心的

背景是黑色,然后绿色的各种各样的字符从上方以不同的速度进入画面

显得非常神秘莫测。那么今天呢,我也想做一个简化版的数字雨

跟大家一块来深入理解对象是如何定义的

如何生成的,并且它是怎么样运行的

好,下面在实际的Pycharm的开发环境中我们来演示和讲解这样的程序

启动Pycharm,打开hack.py这样一个源程序

我们首先来看一下这个程序的基本结构

首先呢,前面两行仍然是导入相关的模块

我在这呢,就不多讲了

这一部分,是声明一些全局的常量和变量

在这里,我声明了四个常量,大家看一下

其中,WIDTH和HEIGHT分别表示的画布的宽和高

COLOR的表示字符的颜色,而CHARS这样一个列表

实际上是用来描述这个字符可能显示的是哪一个字符

这是一个列表结构

最后这个char_list是用来存放你生成的所有的字符对象的

下面呢,我们定义了一个Character的类

当然,这个类呢是定义字符对象的一个模板吧

究竟它有哪些属性,有哪些方法,我们一会再深入的研究

char_spawner这个函数呢,我在这做了一个注释,它是创建字符对象的

按照什么来创建呢。就是按照刚才我们定义的Character类来创建

它仅仅是一个创建工作。而spawner这个英文单词

本来的含义呢

实际上是产卵的鱼

所以这里呢就是生成字符对象

这个函数同学们应该非常熟悉,它是draw函数

每一秒执行60次

只负责把char_list列表当中的所有的字符对象按照他的属性绘制出来

这一部分呢,主要是来创建一个frame,注册屏幕绘制函数draw

其中有一点需要大家注意一下

我在这里创建了一个timer,计时器

这个timer是用来控制字符对象的生成的频率的

比如说,一秒钟要生成多少个字符对象

这个时间间隔呢 我们在这里可以设置

初始化的时候 我给的是10毫秒

最后一部分呢,是启动这个计时器和启动程序

好了,这个是程序的基本结构

这个结构其实同学在前面很多的case或者项目中其实都是这么定义的

好,下面我们来具体的看程序代码

首先,我要跟大家来分析一下,Character这个类

因为它呢是创建字符对象的一个模板

我们看看,它为什么会这么创建

它应该有哪些属性,它应该会有哪些方法。好,我们看一下

想象一下刚才这个课件当中的截图,一个字符从界面的上方进入画面

它有速度,有颜色,有字符内容,还有大小等等

那么这些东西我们在整个的界面当中会看到很多很多的这样的字符对象

但是,这几个属性它们是共有的

那于是呢,我在这里创建这个类的时候,我就会考虑

我要给它赋予position,位置

大家想一想,从界面的正上方进入画面,它显然不是从一个位置进入

它可能随机的从界面的若干个地方进入画面

所以呢我会有一个position,初始的位置是不同的

第二,size,字符有的显示效果大一些,有的小一些

是由这个属性来决定

char,这个呢是用来决定你显示的是1还是0

也就是说你字符对象啊究竟显示的是哪一个字符

那么vel是一个表示速度的一个属性

那在这里呢,请大家注意一下,因为我们的实际运行效果呢

字符是从上进入画面向下移动的,这个时候是没有水平速度的

它不会水平移动,所以这里的vel只是一个纵方向上的分量

也就是说它只是一个值,而不是一个x,y两个分量构成的列表

请大家注意一下。好,大家想一想

屏幕当中所有的字符是不是都应该有位置、大小、字符本身和速度

这就是我为什么把它们定义为属性的原因。好,这是四个属性

那么下面呢,我们来看看方法,在这里我定义了一个move方法

很简单,是移动,这个单词也很好理解,移动

为什么会有这个方法,大家想一想

一旦我创建了这样一个字符对象,它一定要从上到下进行移动

那么字符本身它就应该有这个方法使得自己不断更新位置

产生移动的效果

那么再往下这个方法呢,是draw,这个方法呢就是绘制

它会把自己绘制在屏幕恰当的位置上

当然,随着position这个属性被不断的修改

那么最终呢它会产生一个连续移动的效果

好,那么看一下代码,其实非常好理解

在move当中我做了一个简单的判断,同学们看一下就会很清楚

这个判断呢,其实是用来判断字符对象的位置是否超出了画布范围

如果超出了画布范围,我告诉你返回的结果是Ture

而这个时候提示你这个字符呢已经超出了界面了我应该把它销毁掉

实际上是销毁掉,那么你如果没有超出画面

我就会把你的position,当然这里指的是纵方向上的

会加上速度,更新你的位置,并且告诉你我没有超出画布

你可以继续绘制,这个含义

那么在draw函数当中,很简单

用draw_text绘制字符,绘制它的位置

按照指定的大小、颜色和字体

好,这就是我们字符对象的模板

也就是Chararter这个类

下面我们看如何创建一个对象

在这里我们是把创建工作是写在char_spawner这个函数当中的

其实非常简单,大家来看,这句话就创建了一个所谓的字符对象

何以见得呢?大家看

p=Character就是刚才你定义的这个类名

里面有几个参数呢?有几个属性呢?

大家看,除了self以外,有position,位置

size,尺寸,char,字符,和vel表示速度

那我们看看,我只要把这四个属性给你这个字符对象自然就创建好了

这个是什么?位置,对吧。那么第二个参数是什么呢?是大小

第三个参数是字符,第四个参数是它的移动速度

然后注意,这句话很重要,你创建好了一个对象

我并没有直接绘制,我仅仅是把这个对象呢

加入到了char_list这个列表里面

我刚才讲过,char_list我在初始化的时候是一个空列表

它实际上是用来存放所有你创建好的字符对象,你创建好了一个

我就把它加进来一个,用到的方法呢是append

那这个时候这段代码其实就是简单的讲

创建一个字符对象并且把它加入到char_list这个列表当中

好,再往下看,这个函数会多长时间执行一次呢

大家看,在计时器当中,在timer当中,大家看

是10毫秒这个函数会被执行一次,那言下之意就是10毫秒以后

就会重新创建一个char,并且把它加入到char_list当中

每隔10毫秒创建一个字符对象,加入到这个里头

这个过程是10毫秒执行一次

那这个生成的速度还是很快的。好,下面我们来看draw函数

大家看,我用到了一个循环结构,非常简单,大家看一下

那么我会遍历在char_list里面的所有的字符对象

所有的字符对象我都要遍历一遍,我提取第一个字符对象

我让它先移动一下,判断,大家还记得这个move方法吧

如果这个字符对象超出了画布范围

它返回的是Ture,真值

那这个时候我判断一下c.move

你返回的值是真还是假,如果是真

说明你已经超出了范围

所以呢我用char_list.remove方法

把这个超出画布的字符对象移除

否则,那就是说你没有超出画布的范围

我就把你绘制在画布上

注意,我再来说一下

用一个循环结构来遍历(char_list)当中所有的字符对象

通过字符对象本身的move方法来判断你是否超出画布范围

如果超出,我直接从这个list当中把你移除

remove掉,remove掉

否则的话我会按照规则把你绘制出来,这就是draw函数的作用

那么大家想一想他们之间的关系,那我们来回顾一下

定义一个Character这个类,用来作为创建字符对象的模板

那么char_spawner这个函数

它只是完成创建一个对象把它加入到一个对象的列表当中

叫char_list

这个函数的执行频率是每隔10毫秒执行一次

这个是由我们的计时器来控制的

这个是由计时器控制,你只管生成

每隔10毫秒生成一个,加入到list当中

你只管完成这个工作

那么draw函数呢,它不管生成工作,它只管绘制工作

它只遍历ist你存放所有字符对象的这样一个list

判断你是否越界,如果越界,我会把你remove

否则我会把你显示出来,draw出来

这就是我们的整个程序的主要结构和逻辑关系

好,下面我们运行一下

大家看,是这样一个结构,它会沿着一个固定的位置

不断的生成一条看起来好像是一个绿色的线条

实际上呢,它是很多个字符对象构成的

大家来看,为什么会这样呢?

在char_spawner这个函数中,大家注意

我创建的这个Character呢,这四个参数呢

我是给的固定的,固定的

也就是说所有的字符对象都是在10、0这个位置上

0是纵坐标,那就意味着在画面的上边缘

而10呢表示的是横坐标

就表示离左边边界有10个像素,所有的字符都是在这一个位置生成

并且,所有字符的大小都是10,所有的字符都是0

速度都是1,所以大家看起来在同一个位置

以同样的速度,同样的大小,同样的字符生成的这样很多的字符对象

在界面上看起来就像一条绿色的线段,实际上不是这样的

那比如说,我现在想把它在随机的位置上生成

那这就要用到我们的random这个模块里面的random.randint

这个时候我用0和30来表明它是在一定的范围内随机生成你的初始位置

那好,我们来把这一点代码我们复制上去,我们看一下效果

我们把这个固定位置,改成随机位置,就改这么一点我们来看一下

运行,大家看这个时候呢,实际上位置已经随机了

因为满屏幕都已经有了,都平铺了

那么大家看大小、速度还有这个字符本身0还是1

还是一样,那这个时候呢,我们再把剩下几个参数也做一下随机的处理

好,那么为了节约时间,我把这句话呢就直接注释一下

我就用下面写好的这样一句话给大家展示

好,运行一下,好,大家来看,这个时候

各个字符对象初始的位置是随机的,速度也是随机的

有的快,有的慢,你看后面很多的

好像看起来比较慢,那么有的大,有的小,有的是0有的是1

实际上呢,仅仅是把这四个参数呢做了一下随机的处理

比如说 位置我随机了,大小我也要随机,那么字符呢

注意,我也随机生成一个

这个生成的字符呢是在CHARS这个列表里面随机选择了一个

0或者1

随机选择了一个,那么,后面呢我们还对它的速度进行了随机

速度呢,3或者6,当然,数字越大,速度越快

那这个时候呢,大家回顾一下这个程序

利用Character类,定义了字符对象的模板

然后用char_spawner创建了字符对象

并且把它加入到这个字符对象的列表当中

时间的间隔是10毫秒

这个是由timer计时器来控制的,那么draw函数

只负责把你加入的char_list的这些字符对象逐一的绘制出来

判断一下你是否越界,如果越界

我就不绘制,仅仅是把你移除

那么这个程序呢,我们可以很容易的做一些扩充

比如说,我不仅想让你显示0,1这两个字符

我还想让你显示比如说a

再比如说我再加一个z

甚至我还可以再加一些特殊字符,我们来看一下

比如说加@,好,我们把这个刚才正在运行的程序关一下

我们再来运行一下,好,大家看

这个时候,字符的种类也就更多

好了,通过这样一个例子,我想向大家展示什么呢?

展示对象是如何定义的?为什么要这么去定义?

如何生成的,并且在我们的draw函数当中是怎么样对它进行绘制的

好了,今天的课我们就讲到这里

Python 交互式程序设计导论课程列表:

第0周

-课程简介

--课程简介

-A 课程视频(算数操作符及表达式)

--绪论

--Python交互式解释器使用方法

--PyCharm集成开发环境介绍

--算数操作符及表达式

-B 课程视频(变量及赋值)

--变量

--项目提交

--“我喜欢Python”热身小项目

-C 辅助视频(计算机结构、Python开发环境安装)

--Windows平台安装Python开发环境

--Mac平台安装Python开发环境

-D 辅助视频(如何提交项目)

--项目提交

-第0周--小测验

-本周项目:"我喜欢Python"

--项目发布、完成、提交及评分流程

--游戏说明

--程序说明

--编码步骤

--评分标准

--项目模板

--项目提交

第1周

-A 课程视频(函数)

--函数

--其它操作符

--随机函数

-B 课程视频(逻辑及表达式)

--逻辑值和比较

--条件

--编程技巧

--“老虎杠子鸡虫”游戏

-第1周--小测验

-本周项目:“老虎杠子鸡虫”游戏

--游戏说明

--程序说明

--编码步骤

--评分标准

--项目模板

第2周

-A 课程视频(Python交互式应用)

--事件驱动编程

--事件可视化跟踪执行

--SimpleGUITk

--按钮

-B 课程视频(输入框、全局变量)

--输入框

--局部变量和全局变量

--编程技巧

--“猫咪藏在哪个房间”游戏

-第2周--小测验A

-第2周--小测验B

-本周项目:猫咪藏在哪个房间

--游戏说明

--程序说明

--编码步骤

--评分标准

--项目模板

第3周

-A 课程视频(画布绘图)

--画布和图形绘制

--字符串处理

--绘图和计时器可视化跟踪执行

--图片和音效

-B 课程视频(计时器)

--计时器

--交互式绘图

--“神奇时钟”游戏

--编程技巧

-第3周--小测验A

-第3周--小测验B

-本周项目:“神奇时钟”

--游戏说明

--程序说明

--编码步骤

--评分标准

--项目模板

第4周

-A 课程视频(列表)

--列表

--键盘输入

--列表及变化可视化跟踪执行

--碰撞和反射

-B 课程视频(键盘控制)

--速度控制

--运动

--编程技巧

--“桌上冰球”游戏

-第4周--小测验A

-第4周--小测验B

-本周项目:“桌上冰球”游戏

--游戏说明

--程序说明

--编码步骤

--评分标准

--项目模板

第5周

-A 课程视频(鼠标输入、列表进阶)

--鼠标输入

--Video

--Video

--Video

-B 课程视频(字典和图片)

--Video

--Video

--Video

--Video

-第5周--小测验A

-第5周--小测验B

-本周项目:“世界杯八强连连看”

--游戏说明

--程序说明

--编码步骤

--评分标准

--项目模板

第6周

-A 课程视频(类)

--面向对象编程(类和对象入门)

--面向对象编程(类和对象进阶)

--对象可视化跟踪执行

--华容道中的类

-B 课程视频(平铺图片)

--平铺图片

--理解对象

--编程技巧

--“华容道”游戏

-第6周--小测验A

-第6周--小测验B

-本周项目:“华容道”游戏

--游戏说明

--程序说明

--编码步骤

--评分标准

--项目模板

第7周

-A 课程视频(类进阶及文件操作)

--集合

--文件操作

--文字块类

--处理停止的文字块

-B 课程视频(游戏状态控制)

--游戏记分规则

--游戏结束的条件及处理

--编程技巧

--“决战三字经”游戏

-第7周--小测验A

-第7周--小测验B

-本周项目:决战三字经

--游戏说明

--程序说明

--编程步骤

--评分标准

--项目模板

第8周

-A、课程视屏(精灵集合)

--Video

--精灵类

--战士类

--编程技巧

-B、课程视屏(动画)

--精灵碰撞

--精灵动画

--编程技巧

--保卫家园游戏

-第8周--小测验

-本周项目:守卫家园

--游戏说明

--程序说明

--编程步骤

--评分标准

--项目模板

理解对象笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。