第14讲类的继承与综合测试_第1页
第14讲类的继承与综合测试_第2页
第14讲类的继承与综合测试_第3页
第14讲类的继承与综合测试_第4页
第14讲类的继承与综合测试_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 类的继承 如果一个类A继承自另一个类B,就把这个A称为B的子类,而把B称为A的父类。继承可以使得子类具有父类的各种属性和方法,而不需要再次编写相同的代码。在令子类继承父类的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类的原有属性和方法,使其获得与父类不同的功能。另外,为子类追加新的属性和方法也是常见的做法。 类的继承 【格式】class 类名(父类名) 类的继承 【实例】# coding=gbk#1.学校成员类-class SchoolMember: #定义基本属性 name = age = 0 #构造方法 def _init_(self,name,age): =

2、 name self.age = age print init SchoolMember: , #实例方法 def tell(self): print name:%s; age:%s % (, self.age) 类的继承 【实例】#2.教师类-class Teacher(SchoolMember): def _init_(self,name,age,salary): SchoolMember._init_(self,name,age) self.salary = salary print init Teacher: , def tel

3、l(self): SchoolMember.tell(self) print salary: , self.salary 类的继承 【实例】#3.学生类-class Student(SchoolMember): def _init_(self,name,age,marks): SchoolMember._init_(self,name,age) self.marks = marks print init Student: , def tell(self): SchoolMember.tell(self) print marks: , self.marks 类的继承 【实例】

4、#4.调用-t = Teacher(yanggang, 20, 1000) s = Student(liming, 12, 86) members = t,s printfor member in members: member.tell()多重继承 类的多重继承【说明】Python的类分为经典类 和 新式类,经典类是python2.2之前的东西,但是在2.7还在兼容,但是在3之后的版本就只承认新式类了两者的区别是经典类是默认没有派生自某个基类的,而新式类是默认派生自object这个基类的。【多重继承】是指可以继承多个类,有多个父类.因此只继承一个类的继承方式,又称为单继承。【格式】class

5、 类名(父类1,父类2,.,父类n) 类的多重继承class speaker(): topic = name = def _init_(self,n,t): = n self.topic = t def speak(self): print(I am %s,I am a speaker!My topic is %s%(,self.topic) 类的多重继承#多重继承 class sample(speaker,student): a = def _init_(self,n,a,w,g,t): student._init_(self,n,a,w,g) spea

6、ker._init_(self,n,t) test = sample(Tim,25,80,4,Python) test.speak()#方法名同,默认调用的是在括号中排前地父类的方法 类的多重继承【注意】需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索,即方法在子类中未找到时,从左到右查找父类中是否包含方法 Python接口和抽象类 接口和抽象类【抽象类】抽象类是用来捕捉子类的通用特性的 。它不能被实例化,只能被用作子类的父类。抽象类是被用来创建继承层级里子类的模板。【接口】接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象

7、类是可以有私有方法或私有变量的。另外,实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。 类的多重继承【注意】python中不存在“基类”的概念,也没有单根,更没有基本类型,所有的一切都是对象。python是无神论的最完美体现,没有亚当,没有上帝,没有鬼神,没有唯一的主。你爱信什么信什么,爱是什么是什么,没有任何约束类的多态 python 多态【说明】首先Python不支持多态,也不用支持多态,python是一种多态语言,崇尚鸭子类型。“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也

8、像鸭子,那么这只鸟就可以被称为鸭子。”变量变量 python 多态【什么是多态】顾名思义,多态就是多种表现形态的意思。它是一种机制、一种能力,而非某个关键字。它在类的继承中得以实现,在类的方法调用中得以体现。多态意味着变量并不知道引用的对象是什么,根据引用对象的不同表现不同的行为方式。 python 运算符多态【运算符多态实例】a=34b=57print(a+b)#91a=世界b=你好print(a+b)#世界你好【解析】 我们不知道+法运算符左右两个变量是什么类型,当我们给的是int类型时,它就进行加法运算。当我们给的是字符串类型时,它就返回的是两个字符串拼接的结果。也就是根据变量类型的不同

9、,表现不能的形态。 python 类的多态【方法多态实例】-MyClass.py-class People: def say(self): print(大家好!)class Student: def say(self): print(老师好!)-Main.py-from random import choiceimport MyClassp1=MyClass.People()stu1=MyClass.Student()#通过choice方法我们可以随机选择列表中的某一项obj=choice(p1,stu1) print(type(obj)obj.say() python 类的多态【解析】我们创

10、建的临时对象obj是由随机函数取出来的,我们不知道它的具体类型,但是我们可以对它进行相同的操作。即让它调用say方法,然后根据其类型的不同,它所表现的行为不同。这就是多态。 python 类的封装【说明】面向对象的程序设计中,某个类把所需要的数据(也可以说是类的属性)和对数据的操作(也可以说是类的行为)全部都封装在类中,分别称为类的成员变量和方法(或成员函数)。这种把成员变量和成员函数封装在一起的编程特性称为封装。类由属性和方法组成,类的属性是对数据的封装,而类的方法是对类的行为的封装。 python 类与对象的检查Callable(object):检查对象是否可调用。hasattr(obje

11、ct,method):检查给定的对象是否有指定的属性。getattr(object,name):返回给定对象中所指定的特征的值,可选择给定默认值。issubclass(subclass, superclass):检查subclass是否是superclass的子类(每个类都是自身的子类)。isinstance(object, class):检查给定的对象object是否是给定的class类的实例。 Callable(object)【说明】检查对象object是否可调用。如果返回True,object仍然可能调用失败;但如果返回False,调用对象ojbect绝对不会成功。【注意】类是可调用的,

12、而类的实例实现了_call_()方法才可调用。【版本】该函数在python2.x版本中都可用。但是在python3.0版本中被移除,而在python3.2以后版本中被重新添加。 实例 callable(0)False callable(mystring)False def add(a, b): return a + b callable(add)True class A: def method(self): return 0 callable(A)True练习经典问题:经典问题: 八皇后问题。八皇后问题。 要求分析:要求分析:n八皇后放在8x8的方格里;n互相不能在同一行和同一列;n互相不能在

13、对角线上。201404106. Python 类与对象27 def conflict ( state, nextX ):nextY=len(state)for i in range(nextY):if abs(statei-nextX) in (0,nextY-i):return Truereturn False 寻找冲突寻找冲突 已知皇后的位置传递给函数已知皇后的位置传递给函数conflict,然后用函数判断下,然后用函数判断下一个皇后的位置有没有冲突。其中一个皇后的位置有没有冲突。其中nextX是下一个皇后的水是下一个皇后的水平位置,平位置,nextY是垂直位置。如果与前一个皇后的水平位置

14、是垂直位置。如果与前一个皇后的水平位置之差为零(在同一列)或者等于与前一个垂直位置之差(在之差为零(在同一列)或者等于与前一个垂直位置之差(在同一个对角线)就冲突,否则就没有冲突。同一个对角线)就冲突,否则就没有冲突。201404106. Python 类与对象28 def queens(num=8,state=(): if len(state)=num-1: for pos in range(num): if not conflict(state,pos): yield (pos,) 基本情况基本情况 从基本情况开始。用语言描述就是:如果只剩最后一个从基本情况开始。用语言描述就是:如果只剩最

15、后一个皇后没有放置,那么遍历她的所有可能的位置,并且返回与皇后没有放置,那么遍历她的所有可能的位置,并且返回与前面没有发生冲突的位置。前面没有发生冲突的位置。num是皇后的总数,是皇后的总数,state是存放是存放前面皇后的位置信息的元组,前面皇后的位置信息的元组,conflict是前面介绍的冲突函数。是前面介绍的冲突函数。201404106. Python 类与对象29 需要递归需要递归 从前面的皇后得到包含位置信息的元组,并且要为后面从前面的皇后得到包含位置信息的元组,并且要为后面的皇后提供当前皇后的每种合法的位置信息。为了让程序继的皇后提供当前皇后的每种合法的位置信息。为了让程序继续下去

16、,接下来就需要把当前的位置信息添加到位置元组中续下去,接下来就需要把当前的位置信息添加到位置元组中并传给后面的皇后。并传给后面的皇后。 def queens(num=8,state=():for pos in range(num):if not conflict(state,pos):if len(state)=num-1:yield (pos,)else:for result in queens(num,state+(pos,):yield (pos,)+result201404106. Python 类与对象30 def conflict ( state, nextX ):nextY=le

17、n(state)for i in range(nextY):if abs(statei-nextX) in (0,nextY-i):return Truereturn False def queens(num=8,state=():for pos in range(num):if not conflict(state,pos):if len(state)=num-1:yield (pos,)else:for result in queens(num,state+(pos,):yield (pos,)+result201404106. Python 类与对象31 list(queens(4)(1

18、, 3, 0, 2), (2, 0, 3, 1) for solution in queens(8):print(solution)(0, 4, 7, 5, 2, 6, 1, 3)(0, 5, 7, 2, 6, 3, 1, 4)(0, 6, 3, 5, 7, 1, 4, 2)(0, 6, 4, 7, 1, 3, 5, 2)(1, 3, 5, 7, 2, 0, 6, 4). len(list(queens(8)92201404106. Python 类与对象32 def prettyprint(solution): def line(pos,length=len(solution): retur

19、n . *(pos)+q +. *(length-pos-1) for pos in solution: print(line(pos) import random prettyprint (random.choice (list(queens(8). . . . . q . . . . q . . . . . . . . . . . q . . q . . . . . . . . . . . . . q . . . . q . . . q . . . . . . . . . . q . . . . 201404106. Python 类与对象33练习第 0000 题:将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果。类似于图中效果第 0001 题:做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生成激活码(或者优惠券),使用 Python 如何生成 200 个激活码(或者优惠券)?第 0002 题:将 0001 题生成的 200 个激活码(或者优惠券)保存到 MySQL 关系型数据库中。第 0003 题:将 00

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论