1、内泰提纲11.1面句对象程序设计思想.o11.2 类和对象.011.3 属性和数据.-.-.011.4 方法.-.-.Q11.5 继承内家提纲11.6 多态与封装1L7定制类11.8 迭代器11.9 生成器11.10 综合示例本章小结治引例要求在终端输出如下信息。明明明晨晨晨 李李李张张张20岁,20岁,20岁,30岁,30岁,30岁,男,男,男男男男计算机专业掌握面向对象编程精通Python语言计算机专业精通Python语言掌握面向对象编程传统程序设计VS面向对象设计def major(name,age,gender):print($,%5岁,$,计算机专业%(name,age,gender
2、)def technique(name,age,gender):print($,%$岁,5,掌握面向对象编程%(name,age,gender)def language(name,age,gender):print(%s,%s岁,s,精通Python语言%(name,age,gender)major(“李明”,20,“男)technique(李明”,20,“男“)language(“李明”,20,“男)major(张晨”,30,“男)language(张晨”,30,“男)technique(张晨”,30,“男“)class Person:def _init_(self,name,age,gen
3、der):self.name=name self.age=age self.gender=genderdef major(self):print(”s,%s岁,s,计算机专业%(self.name,self.age,self.gender)def technique(self):print(”$,%5岁,$,掌握面向对象编程(self.name,self.age,self.gender)def language(self):print(s,%s岁,s,精通Python语言”%(self.name,self.age,self.gender)ming=Person(“李明”,20,“男)ming.
4、major()ming.technique()ming.language()chen=Person。张晨”,30,“男“)chen.major()chen.technique()nhpn gnrniaria八11.1面向对象程序设计思想:面向对象的基本设计思想 面向对象是从现实世界中客观存在的事物(即对象)出发来构造软件系统 强调直接以问题域(现实世界)中的事物为中心来思 考问题,认识问题 根据这些事物的本质特点,把它们抽象地表示为系统 中的对象,作为系统的基本构成单位 使系统直接地映射问题域,保持问题域中事物及其相 互关系的本来面貌11J J面向对象的基本概念:对象对象是现实世界中一个 实际
5、存在的事物,它可 以是一个物理对象,还 可以是某一类概念实体 的实例。面向对象程序设计的对 象,是系统中用来描述 客观事物的一个实体,是构成系统的一个基本 单元,由一组属性和一 组行为构成。:类 类是具有相同或相似性 质的对象的抽象。类是具有相似结构、行 为和关系的一组对象的 描述符,类包括属性和 操作。对象的抽象是类,类的 具体化就是对象,也可 以说类的实例是对象,类实际上就是一种数据-继承继承反应客观世界中各 类事物之间的一种“一 般和特殊”的关系。继承是指类之间有继承 关系,子类有条件地继 承父类的特征。一个新类可以从现有的 类中派生出来,这个过 程称为类继承。类的对象是各自封闭的,如果
6、没继承机制,则 类对象中的数据、方法 就会出现大量重复。继承不仅支持系统的可 重用性,而且还促进系 统的可扩充性。面向对象的基本卜心:封装封装就是把对象的属性 和基于属性的操作结合 成一个不可分割的独立 实体,并尽可能隐蔽对 象的内部细节,只保留 一些对外接口使之与外 部发生联系封装的目的在于把对象 的设计者和使用分开,使用者不必知晓行为实 现的细节,只需用设计 者对外提供的接口来访 问该对象如司机没有必要为了开 车而去了解以汽油作为 动力的内燃机引擎的工 作原理。11J J面向对象的基本概念:多态多态一般指具有多种形 态的能力对象的多态是指在一般 类中定义的属性或操作 被特殊类继承后,可以
7、具有不同的数据类型或 表现出不同的行为。利用多态性,用户可以 发送一个通用的信息,而将所有的实现细节都 留给接收消息的对象自 行决定。在面向对象程序设计中,可以在派生类中重定 义基类函数来实现多态 性。11J.2面向对象设计:面向对象程序设计借助特定的计算机语言实现从现实世界问题域中的实 体到计算机世界中的对象的映射表达。首先需要将客观存在的实体抽象成概念世界中的抽象 数据类型抽象数据类型里面包括实体中与需要解决的问题相关的 属性和方法再用面向对象的工具将这个抽象数据类型用计算机逻 辑表达出来即构造计算机能够理解和处理的类再将类进行实例化就得到了现实世界中的实体在计算 机世界中的映射对象面向对
8、象设计:面向对象程序设计具有如下优点 符合人们习惯的思维方法,便于分解大型的复杂多变 的问题 易于软件的维护和功能的增减 可重用性好 与可视化技术相结合,改善了工作界面11.2类和对象:类和对象关系对象是对某个具体客观事物的抽象类是对对象的抽象描述,在计算机语言中是一种抽象 的数据类型。类定义了数据类型的数据(属性)和行为(方法)。类与对象的关系是:对象是类的实例,类是对象的模板。对对象进行抽象为类-类(CLASS)例如:man class李明对类进行实例化11.2类和对象:创建类 Python定义一个类使用关键字class声明,类的声明格式如下:class className:类体class
9、是关键字className(类名)为有效的标识符命名规则一般为多个单词组成的名称,除每个单词的首字母大写外,其余字母 均小写。注意类名后面有个冒号。在类体中,可以定义属性和方法,由缩进 的语句块组成。11.2类和对象:创建对象类是抽象的,必须实例化类才能使用类定义的功能,即创建类的对象把类的定义视为数据结构的类型定义,那么实例化就 是创建了 一个这种类型的变量对象的创建和调用格式如下:anObject=className()例H-1定义类Person,创建Person类的对象p,并打印pclass Person:#定义类Personpass#类体为空语句p=Person()#创建和使用对象pp
10、rint(p)11.3属性和数据:类的数据成员是在类中定义的成员变量,用来存 储描述类的特征的值,称为属性。:属性可以被该类中定义的方法访问,也可以通过 类或类的实例进行访问。类属性 实例属性 私有属性/公有属性 自定义属性11.3.1类属性:类属性是类的数据或函数,类的数据属性仅仅是 所定义的类中的变量,它们可以像任何其他变量 一样在类定义后被使用。类属性属于整个类,不是特定实例的一部分,而是所 有实例之间共享的一个副本。类属性通常在类体中初始化,然后,在类定义的方法 或外部代码中,通过类名访问类属性的读、写访问都是通过“类名来实现的【例11-2定义Person类及其属性,利用类名访问类属性
11、class Person:name=Timage=22print(Person.name,Person.age)11.3.2实例属性每个实例对象都有自己的属性,通过“self.”变量 名定义,实例属性属于特定的实例。实例变量在类的内部通过“self.”访问 在外部通过对象实例访问。实例属性初始化:通常在init方法中利用“self对 实例属性进行初始化。类的内部通过“self.”访问se实例变量名=值外部利用对象名访问:obj=className()#创建对象obj.实例变量名=值#写入obj.实例变量名#读取11.3.2实例属性0【例11-3定义Student类,包括属性和方法,定义Stud
12、ent类的实例s1和s2,赋予不同的参数值,并通过实例名调用实例属性和方法。class Student:def _init_(self,name,age,grade):self.name=name self.age=ageself.grade=gradedef say_hi(self):print(!l am a student,my name is,self.name)s1=Student(Tom,21,3)s1.say_hi()print(s1.grade)s2=Student(,Mike,20)2)s2.say_hi()print(s2.grade)运行结果如下:I am a stude
13、nt,my name is Tom 3I am a student,my name is Mike 211.3.3类属性与实例属性的联系:类与实例有各自的名字空间。类属性可以通过类 或实例访问,当通过实例访问,Python则先查找 实例的名字空间,再找类的名字空间,最后找基 类的名字空间;如果在实例空间找到了该属性名,则访问实例的 属性,而如果类名字空间也有这个属性,则会被 隐藏,直到实例属性被清除。:私有属性指的是只有在类方法中才能访问私有属 性,对象不能直接访问私有属性。公有属性可以被对象直接访问。:通常约定两个下画线开头,但是不以两个下画线 结束的属性为私有属性,其他的都是公有属性。na
14、meclass A:name=class A def get_name()print(A._name)A.get_name()A.name#私有属性#在类方法中访问私有类属性#通过方法访问私有类属性#不能直接访问私有类属性,会报错11.3.4私有属性与公有:【例11-4】定义CustomerCounter类,包括私有属性privateCount和 公有属性publicCount,定义方法count。访问私有属ii和公有属性,利用两种方式访问私有属性:对象利用count方法访问私有属性;对 象直接访问私有属性。class CustomerCounter:privateCount=0#私有变量pu
15、blicCount=0#公有变量def count(self):self._privateCount+=1self.publicCount+=1print(privateCount:,self._privateCount)ent=CustomerCounter()cnt.count()cnt.count()print(cnt.publicCount)print(cnt.privateCount)#报错,实例不能访问私有变量11.3.5自定义属性:自定义属性,即类定义中不存在的属性对象通过_d ict_存储自定义属性:获取属性的值和设置属性的值的方法 getattr_(self,name):获取
16、属性,访问不存在的属 性时调用 _getattribute_(self,name):获取属性,访问存在的 属性时调用(先调用该方法,查看是否存在该属性,若不存在,接着去调用 getattr_)_setattr_(self,name,value):设置实例对象的一个 新的属性 _delattr_(self,name):删除一个实例对象的属性11.3.5自定义属性【例115】自定义属性示例,定义CustomAttribute类,定义方法getattrj),getattribute(),setattr_()和_delattr_()方法,方法中输出方法幺,在main函数中,通过属性值设置,验证属性设置
17、所需调用的方法。class CustomAttribute:def _getattr_(self,name):print(_getattr_)def _getattribute_(self,name):print(*_getattribute_)return object._getattribute_(self,name)def _setattr_(self,name,value):object._setattr_(self,name,str.strip(value)printC_setattr_)def _delattr_(self,name):printC_delattr_)if _nam
18、e_=_main_o=CustomAttribute()o.firstname=Lily,#定义一个实例。的属性firstnameprint(o.firstname)11.3.6 self 的作用:*se时旨的是类实例对象,不是类 sHf只有在类的方法中才会有,独立的函数或方法是不 必带有sHf的 se斤在定义类的方法时是必须有的,虽然在调用时不必 传入相应的参数o11.4方法:方法是与类相关的函数。:方法和函数不同函数是封装操作的小程序方法是定义在类内部的函数,并且定义方法与普通函 数有所不同类的方法主要有三种类型 实例方法 类方法 静态方法:不同的类方法有不同的使用场景和声明调用形式,不同
19、的方法也具有不同的访问限制11.4.1方法的声明和调:方法的声明和调用一般形式 在类的内部,使用def关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含对象本身的参 数,通常为sHf,且为第一个参数。方法的声明格式def方法名(sHf,形参列表)函数体 方法的调用格式对象.方法名(实参列表)方法定义时的第一个参数self在调用的时候,用户不用给该参数传值,Python自动把对象实例传递给该参数:定义类Stud ent,创建其对象,并调用其方法。class Student:#定义类Studentdef say_hi(self,name):#定义方法 say_hi self.name=
20、name#把参数 name 赋值给 self.nameprint(hello3 my name is,self.name)s=Student()#创建对象s.say_hi(Alice)#调用对象的方法,不用给se什传值011.4.2实例方法、类方法和静态方法:7 实例方法是属于实例的方法,通过实例名.方法名调用,该方法 可以访问类属性、实例属性、类方法、实例方法和静 态方法。实例方法是在类中最常定义的成员方法,它至少有一 个参数并且必须以实例对象作为其第一个参数,一般 以“self作为第一个参数。在类外,实例方法只能通过实例对象去调用。11.4.2实例方法、类方法和静态方法:7 实例方法实例方
21、法的声明格式如下:def方法名(se%形参列表):函数体实例方法通过实例对象调用:对象.方法名(实参列表)s=Student()#创建对象s.say hi()#调用对象的方法11.4.2实例方法、类方法和静态方法 2.类方法类方法是属于类的方法可以通过实例名.方法名也可以通过类名.方法名调用 类方法不能访问实例属性和实例方法 类方法不对特定实例进行操作,在类方法中访问实例 属性会导致错误 类方法需要用修饰器“classmethod来标识 第一个参数必须是类对象,一般以“cis”作为第一个参from itertools import*list(islice(fib(),10)1,1,2,3,5,
22、8,13,21,34,5511.10综合示例1.要求按照以下要求定义一个乌龟类和鱼类并尝试编写游戏。假设游戏场景范围为(x,y),0 x10,0y10o(1)游戏生成1只乌龟和10条鱼;(2)它们的移动方向均随机;(3)乌龟的最大移动能力是2(可以随机移动1或2),鱼的最大移动能力是1*9(4)当移动到场景边界,自动向反方向移动;(5)乌龟初始化体力为100;(6)乌龟每移动一次,体力消耗1;(7)当乌龟和鱼坐标重叠,乌龟吃掉鱼,乌龟体力增加20;(8)鱼暂不计算体力;(9)当乌龟体力值为0或者鱼儿的数量为0,游戏结束。:*2.分析根据上述要求,此游戏有两类对象,分别是乌龟和鱼,它们分别具有
23、的能力如下。(1)乌龟:初始化位置(随机),移动(随机1或2,遇到边界向反方向移动),吃鱼(乌龟坐标和鱼坐标重叠,乌龟吃鱼);(2)鱼:初始化位置(随机),移动(移动1,遇到边界向反方向移动)。以上分析表明,乌龟和鱼类都有“随机初始化位置”和“移动”的方法,为 此抽象出它们的父类GameAnimal,在父类中定义初始化位置和移动的方法。此游戏包括三个类,GameAnimal,乌龟和鱼。在主程序中,定义1个乌龟对象和10个鱼对象,然后循环执行如下步骤:(1)获取乌龟的坐标;(2)判断所有鱼当中是否有鱼的坐标与乌龟的坐标重叠,如果重叠则删除此鱼对象,乌龟体力增加20;(3)若鱼被吃完,退出循环;(
24、4)若乌龟能量为0,退出循环。3.代码代码和运行效果请见P205、P20611本章小结 1.介绍了面向对象程序设计方法,介绍类、对象的创建,以及属性和 方法等基本概念。并进一步描述了面向对象的三大特性:继承、多态 和封装。2.对象是对某个具体客观事物的抽象。类是对对象的抽象描述,定义 一个类使用关键字class声明。3.类的数据成员是在类中定义的成员变量,用来存储描述类的特征的 值,称为属性。使用def关键字可以为类定义一个方法,与一般函数 定义不同,有些类方法必须包含缺省参数,如seE cis等。4.每个类至少有一个父类,这两个类之间是一种“is-a”的关系,子类 会继承父类的所有属性。多态意味着不同类的对象使用相同的操作,但在具体调用时会依据具体对象调用不同的实现。封装意味着对外部 隐藏对象的行为,在程序外部看不到。5.迭代器是一个带状态的对象,能在你调用next。方法的时候返回容 器中的下一个值。生成器是一种特殊的迭代器。