实验7面向对象.docx
- 文档编号:4791099
- 上传时间:2022-12-09
- 格式:DOCX
- 页数:13
- 大小:584.44KB
实验7面向对象.docx
《实验7面向对象.docx》由会员分享,可在线阅读,更多相关《实验7面向对象.docx(13页珍藏版)》请在冰豆网上搜索。
实验7面向对象
面向对象编程
【实验名称】
面向对象编程
【实验目的】
1、熟悉面向对象与面向过程的优缺点;
2、熟悉面向对象的编程思想;
3、熟悉面向对象常见操作;
4、熟悉类中类变量、类方法和实例调用方法;
5、熟悉面向对象封装、继承和多态三大特点
6、熟悉类变量和实例变量区别
【实验要求】
1、面向对象的三大特性;
2、熟悉对象的常用函数;
3、熟悉类变量和实例变量区别;
【背景描述】
Python是一种面向对象的解释型语言,面向对象是其非常重要的特性。
所以本节对于了解和学习面向对象编程是很重要的一个章节。
【知识准备】
熟悉Python基本语法、Python脚本运行和pdm调试,有一定的面向对象基础。
【实验设备】
Windows或Linux或MacOS的操作系统的计算机。
本实验提供win7系统。
【实验说明】
为了开发方便,本人用IDLE做为实验教学和模拟环境,不再在CMD下操作。
【实验环境】
系统:
Windows764位旗舰版,
Python版本:
Python3.5.3
开发工具:
IDLE集成开发环境。
【实验步骤】
1、面向过程vs面向对象
面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西。
优点是:
极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可。
缺点是:
一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身。
面向对象的程序设计的核心是对象(上帝式思维),要理解对象为何物,必须把自己当成上帝,上帝眼里世间存在的万物皆为对象,不存在的也可以创造出来。
面向对象的程序设计好比如来设计西游记,如来要解决的问题是把经书传给东土大唐,如来想了想解决这个问题需要四个人:
唐僧,沙和尚,猪八戒,孙悟空,每个人都有各自的特征和技能(这就是对象的概念,特征和技能分别对应对象的属性和方法),然而这并不好玩,于是如来又安排了一群妖魔鬼怪,为了防止师徒四人在取经路上被搞死,又安排了一群神仙保驾护航,这些都是对象。
然后取经开始,师徒四人与妖魔鬼怪神仙互相缠斗着直到最后取得真经。
如来根本不会管师徒四人按照什么流程去取。
面向对象的程序设计的
优点是:
解决了程序的扩展性。
对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。
缺点:
可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法预测最终结果。
于是我们经常看到一个游戏人某一参数的修改极有可能导致阴霸的技能出现,一刀砍死3个人,这个游戏就失去平衡。
在python中面向对象的程序设计并不是全部。
面向对象编程可以使程序的维护和扩展变得更简单,并且可以大大提高程序开发效率,另外,基于面向对象的程序可以使它人更加容易理解你的代码逻辑,从而使团队开发变得更从容。
2、初识类和对象
从上面的例子来看,字典就是一类数据结构,我一说字典你就知道是那个用{}表示,里面由k-v键值对的东西,它还具有一些增删改查的方法。
但是我一说字典你能知道字典里具体存了哪些内容么?
不能,所以我们说对于一个类来说,它具有相同的特征属性和方法。
而具体的{'name':
'eva'}这个字典,它是一个字典,可以使用字典的所有方法,并且里面有了具体的值,它就是字典的一个对象。
对象就是已经实实在在存在的某一个具体的个体。
再举一个其他的例子,通俗一点,比如你现在有一个动物园,你想描述这个动物园,那么动物园里的每一种动物就是一个类,老虎、天鹅、鳄鱼、熊。
他们都有相同的属性,比如身高体重出生时间和品种,还有各种动作,比如鳄鱼会游泳,天鹅会飞,老虎会跑,熊会吃。
但是这些老虎熊啥的都不是具体的某一只,而是一类动物。
虽然他们都有身高体重,但是你却没有办法确定这个值是多少。
如果这个时候给你一只具体的老虎,而你还没死,那你就能给他量量身高称称体重,这些数值是不是就变成具体的了?
那么具体的这一只老虎就是一个具体的实例,也是一个对象。
不止这一只,其实每一只具体的老虎都有自己的身高体重,那么每一只老虎都是老虎类的一个对象。
在python中,用变量表示特征,用函数表示技能,因而具有相同特征和技能的一类事物就是‘类’,对象是则是这一类事物中具体的一个。
3、类的认识
实例化:
类名加括号就是实例化,会自动触发__init__函数的运行,可以用它来为每个实例定制自己的特征。
类属性的补充
dir(类名):
查出的是一个名字列表
类名.__dict__:
查出的是一个字典,key为属性名,value为属性值
类名.__name__#类的名字(字符串)
类名.__doc__#类的文档字符串
类名.__base__#类的第一个父类(在讲继承时会讲)
类名.__bases__#类所有父类构成的元组(在讲继承时会讲)
类名.__module__#类定义所在的模块
类名.__class__#实例对应的类(仅新式类中)
4、认识对象
对象是关于类而实际存在的一个例子,即实例
对象/实例只有一种作用:
属性引用
Python的类的方法和普通的函数有一个很明显的区别,在类的方法必须有个额外的第一个参数self,它指代的是对象本身。
创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性
而类有两种属性:
静态属性和动态属性。
静态属性就是直接在类中定义的变量。
其中类的数据属性是共享给所有对象的
动态属性就是定义在类中的方法。
而类的动态属性是绑定到所有对象的
创建一个对象/实例就会创建一个对象/实例的名称空间,存放对象/实例的名字,称为对象/实例的属性。
在obj.name会先从obj自己的名称空间里找name,找不到则去类中找,类也找不到就找父类...最后都找不到就抛出异常
5、类变量和实例变量区别
类的属性可以通过类和实例对象来访问。
可以通过对象实例和类来访问类变量,类属性的修改会影响到所有的实例。
如果通过实例对象来修改类中不可变对象时,则实例对象绑定一个同名的变量。
如上可知,当通过实例对象来修改类中不可变对象时,实例此时绑定一个同名的变量,可以用delc.version删除绑定的实例变量。
如上图,当通过实例修改类中的可变属性时,实例没有动态绑定一个实例属性变量,这种情况除重新赋值给实例属性变量,那样也是重新绑定一个实例属性变量。
总之,使用实例属性来修改类属性是很危险的,原因在于实例拥有它们自己的属性集。
6、面向对象的三大特性
封装:
封装描述了对数据/信息进行隐藏的观念,它对数据属性提供接口和访问函数。
继承:
继承描述了子类属性从祖先类继承这样一种方式,子类从父类中继承所有的方法和属性。
多态:
多态的概念指出了对象如何通过他们共同的属性和动作来操作及访问,而不需考虑他们具体的类。
多态表明了动态(又名,运行时)绑定的存在,允计重载及运行时类型确定和验证。
7、实例中属性可见性
实例中私有函数/方法不可以从它们的模块、类外面访问。
__xxx用双下划线作为类中的私有标记。
从下图我们可以看出,实例中私有变量不能访问。
8、类中常见方法
__init__()"构造器"方法,用于在实例化对象时自动调用作为初始化的函数,如果没有定义,则实例不会施加任何操作。
__del__()"解构器"方法,该函数要直到该实例对象所有的引用都被清除掉后才会执行。
issubclass(),issubclass()布尔函数判断一个类是另一个类的子类或子孙类。
isinstance()布尔函数在判定一个对象是否是另一个给定类的实例时,非常有用。
supper(),使你不需要明确提供父类,在子类的构造函数中调用父类的函数。
9、金额转换程序
【问题与回答】
1、什么样的代码才是面向对象?
答:
从简单来说,如果程序中的所有功能都是用类和对象来实现,那么就是面向对象编程了。
2、函数式编程和 面向对象如何选择?
分别在什么情况下使用?
答:
须知:
对于C#和Java程序员来说不存在这个问题,因为该两门语言只支持面向对象编程(不支持函数式编程)。
而对于Python和PHP等语言却同时支持两种编程方式,且函数式编程能完成的操作,面向对象都可以实现;而面向对象的能完成的操作,函数式编程不行(函数式编程无法实现面向对象的封装功能)。
3、类和对象在内存中是如何保存?
答:
类以及类中的方法在内存中只有一份,而根据类创建的每一个对象都在内存中需要存一份,大致如下图:
如上图所示,根据类创建对象时,对象中除了封装name和age的值之外,还会保存一个类对象指针,该值指向当前对象的类。
实例化后调用方法时先找到实例对象指针,再找到调用方法,将实例对象指针传到方法的self中。
【操作与练习】
练习面向对象三大特点、函数调用、变量可见性。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 面向 对象
![提示](https://static.bdocx.com/images/bang_tan.gif)