版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
厦门大学林子雨编著《Python程序设计基础教程(微课版)》教材习题题目第7章面向对象程序设计(版本号:2022年1月版本)主讲教师:林子雨厦门大学数据库实验室二零二二年一月厦门大学林子雨编著《Python程序设计基础教程(微课版)》教材配套实验指南第7章面向对象程序设计 第5页
一、简答题1. 简单描述保护属性安全性的一般处理方式。2. 简单描述什么是多重继承。3. 简单描述什么是方法的重写。编程题1.定义一个类判断给定字符串中的括号(包括“<>”、“()”、“[]”、“{}”四种类型的括号)是否正确配对。例如:"()adafd{)}"是错误配对,"()adafd{(<>)}"是正确配对,"{[({})]}"是正确配对。2.实现一个名为“Rectangle”的表示矩形的类,该类包含两个公有的实例属性width和height,分别表示矩形的宽和高,同时还有一个名为aera的公有方法,该方法返回矩形的面积。3.修改习题2中的Rectangle类,将实例属性width和height改为可读写的property,并且在写操作时检查是否为正值,将area方法改为一个只读的property。下面是测试代码:>>>a=Rectangle(3,4)>>>a.width=-5#输出错误提示>>>a.width=5>>>a.height=0#输出错误提示>>>a.height=2>>>a.area#返回10>>>a.area=12#输出“AttributeError:can'tsetattribute”4.创建一个User类,其包含一个name的实例属性,由构造函数初始化,还包含一个名为count的类属性用于统计用户数目(创建的实例数)。下面是测试代码:>>>a=User('Mike')>>>User.count#输出1>>>b=User('Tom')>>>User.count#输出2>>>c=User('Jack')>>>User.count#输出35.定义一个名为Calculator的类,使用静态方法定义四个表示加减乘除的运算。测试代码如下:>>>Calculator.add(10,5)#返回15>>>Calculator.subtract(10,5)#返回5>>>Calculator.multiply(10,5)#返回50>>>Calculator.divide(10,5)#返回26.请修改下面的Point类,通过重写相应魔法方法使其支持如下运算符操作:p1+p2,用两个点的x、y坐标分别相加,返回一个新的Point对象;p1-p2,用两个点的x、y坐标分别相减,返回一个新的Point对象;p*n,用点的x、y坐标分别乘以数值n,返回一个新的Point对象;p/n,用点的x、y坐标分别除以数值n,返回一个新的Point对象。classPoint:#请直接修改该类的定义def__init__(self,x,y):self.x=xself.y=ydef__str__(self):return'Point('+str(self.x)+','+str(self.y)+')'if__name__=='__main__':#这是测试代码a,b=Point(4,5),Point(2,3)print(a+b)#输出结果为'Point(6,8)'print(a-b)#输出结果为'Point(2,2)'print(a*2)#输出结果为'Point(8,10)'print(a/2)#输出结果为'Point(2.0,2.5)'7.请继承习题3中的Rectangle类来实现一个名为Square的正方形类,使得可以用Square(边长)的方式实例化该类,并重写父类中width和height的写方法,实现长和高的同时修改。测试代码如下:>>>a=Square(5)>>>a.width=10#同时修改height>>>a.height#输出10>>>a.height=20#要求同时修改width>>>a.width#输出20>>>a.area#输出4008.继承内建的字符串类,实现对字符串的左右循环移动给定整数位(正数代表左移,负数代表右移)。9.请用继承的方法完成习题6的要求。10.考虑如下一个简单的图形绘制程序。定义一个Point类表示二维平面上的点(可以借鉴第6题)。所有图形实体的基类为Shape,其包含一个Point类型的position实例属性,用于表示图形的位置。Shape类有一个方法move_to将图形的位置移动到新的位置,shape还包括一个draw方法,打印输出Shape对象的字符串表示。继承Shape类的具体图形类型包括线段类Line和圆类Circle。Line类初始化的第一个参数为一个端点,也是其位置,另一个参数表示另一个端点,作为另一个实例属性。Circle类初始化的第一个参数表示其圆心,也是其位置,另一个参数表示其半径,作为另一个实例属性。如下的代码已经给出了Shape类的定义,请完成Point类、Line类和Circle类的定义。Line类需要重写move_to方法,在移动位置的同时修改另一个端点的坐标。另外,Line类和Circle类都要求对__str__重写实现,以得到更直观的draw效果,其中类Line的输出信息样式为“Line:第一个端点的坐标--第二个端点的坐标)”,类Circle的输出信息样式为“Circlecenter:圆心坐标,R=半径”。部分例程和测试代码如下:#请实现类Point、Line、CircleclassShape: #不要修改该类def__init__(self):self.position=Point(0,0)defdraw(self):print(str(self))defmove_to(self,position):print("movingto",str(position))self.position=position#下面是测试代码if__name__=='__main__':l=Line(Point(0,0),Point(20,20))l.draw()l.move_to(Point(3,5))#移动到一个新的点l.draw()c=Circle(Point(10,10),5)c.draw()c.move_to(Point(30,20))c.draw()#下面是脚本的期望输出Line:(0,0)(20,20)movingto(3,5)Line:(3,5)(23,25)Circlecenter:(10,10),R=5movingto(30,20)Circlecenter:(30,20),R=5《Python程序设计基础教程(微课版)》教材习题答案第7章面向对象程序设计一、简答题1. 简单描述保护属性安全性的一般处理方式。【参考答案】把这个属性设置为私有的,并设置相应的读写方法。2. 简单描述什么是多重继承。【参考答案】一个子类有多个直接父类。3. 简单描述什么是方法的重写。【参考答案】子类采用同样的方法签名修改继承自父类的方法。编程题1.定义一个类判断给定字符串中的括号(包括“<>”、“()”、“[]”、“{}”四种类型的括号)是否正确配对。例如:"()adafd{)}"是错误配对,"()adafd{(<>)}"是正确配对,"{[({})]}"是正确配对。【参考答案】classSolution:defis_valid(self,str1):stack=[]parenthese_dict={"<":">","(":")","{":"}","[":"]"}forcinstr1:ifcinparenthese_dict.keys():stack.append(c)elifcinparenthese_dict.values():iflen(stack)==0orparenthese_dict[stack.pop()]!=c:returnFalsereturnlen(stack)==0if__name__=='__main__':print(Solution().is_valid("()adafd{)}"))#输出Falseprint(Solution().is_valid("()adafd{(<>)}"))#输出Trueprint(Solution().is_valid("{[({})]}"))#输出True2.实现一个名为“Rectangle”的表示矩形的类,该类包含两个公有的实例属性width和height,分别表示矩形的宽和高,同时还有一个名为aera的公有方法,该方法返回矩形的面积。【参考答案】classRectangle:def__init__(self,width,height):self.width=widthself.height=heightdefarea(self):returnself.width*self.height3.修改习题2中的Rectangle类,将实例属性width和height改为可读写的property,并且在写操作时检查是否为正值,将area方法改为一个只读的property。下面是测试代码:>>>a=Rectangle(3,4)>>>a.width=-5#输出错误提示>>>a.width=5>>>a.height=0#输出错误提示>>>a.height=2>>>a.area#返回10>>>a.area=12#输出“AttributeError:can'tsetattribute”【参考答案】classRectangle:def__init__(self,width,height):self._width=width#为了实现后文的继承,将属性设为保护型的self._height=height@propertydefwidth(self):returnself._width@width.setterdefwidth(self,width):if(width<=0):print('width必须为正值,设置失败')else:print('width设置成功')self._width=width@propertydefheight(self):returnself._height@height.setterdefheight(self,height):if(height<=0):print('height必须为正值,设置失败')else:print('height设置成功')self._height=height@propertydefarea(self):returnself.width*self.height4.创建一个User类,其包含一个name的实例属性,由构造函数初始化,还包含一个名为count的类属性用于统计用户数目(创建的实例数)。下面是测试代码:>>>a=User('Mike')>>>User.count#输出1>>>b=User('Tom')>>>User.count#输出2>>>c=User('Jack')>>>User.count#输出3【参考答案】classUser(object):count=0def__init__(self,name):=nameUser.count+=15.定义一个名为Calculator的类,使用静态方法定义四个表示加减乘除的运算。测试代码如下:>>>Calculator.add(10,5)#返回15>>>Calculator.subtract(10,5)#返回5>>>Calculator.multiply(10,5)#返回50>>>Calculator.divide(10,5)#返回2【参考答案】classCalculator:@staticmethoddefadd(x,y):returnx+y@staticmethoddefsubtract(x,y):returnx-y@staticmethoddefmultiply(x,y):returnx*y@staticmethoddefdivide(x,y):returnx/y6.请修改下面的Point类,通过重写相应魔法方法使其支持如下运算符操作:p1+p2,用两个点的x、y坐标分别相加,返回一个新的Point对象;p1-p2,用两个点的x、y坐标分别相减,返回一个新的Point对象;p*n,用点的x、y坐标分别乘以数值n,返回一个新的Point对象;p/n,用点的x、y坐标分别除以数值n,返回一个新的Point对象。classPoint:#请直接修改该类的定义def__init__(self,x,y):self.x=xself.y=ydef__str__(self):return'Point('+str(self.x)+','+str(self.y)+')'if__name__=='__main__':#这是测试代码a,b=Point(4,5),Point(2,3)print(a+b)#输出结果为'Point(6,8)'print(a-b)#输出结果为'Point(2,2)'print(a*2)#输出结果为'Point(8,10)'print(a/2)#输出结果为'Point(2.0,2.5)'【参考答案】classPoint:def__init__(self,x,y):self.x=xself.y=ydef__str__(self):return'Point('+str(self.x)+','+str(self.y)+')'def__add__(self,other):returnPoint(self.x+other.x,self.y+other.y)def__sub__(self,other):returnPoint(self.x-other.x,self.y-other.y)def__mul__(self,n):returnPoint(self.x*n,self.y*n)def__truediv__(self,n):returnPoint(self.x/n,self.y/n)if__name__=='__main__':#这是测试代码a,b=Point(4,5),Point(2,3)print(a+b)#输出结果为'Point(6,8)'print(a-b)#输出结果为'Point(2,2)'print(a*2)#输出结果为'Point(8,10)'print(a/2)#输出结果为'Point(2.0,2.5)'7.请继承习题3中的Rectangle类来实现一个名为Square的正方形类,使得可以用Square(边长)的方式实例化该类,并重写父类中width和height的写方法,实现长和高的同时修改。测试代码如下:>>>a=Square(5)>>>a.width=10#同时修改height>>>a.height#输出10>>>a.height=20#要求同时修改width>>>a.width#输出20>>>a.area#输出400【参考答案】classRectangle:def__init__(self,width,height):self._width=widthself._height=height@propertydefwidth(self):returnself._width@width.setterdefwidth(self,width):if(width<=0):print('width必须为正值,设置失败')else:print('width设置成功')self._width=width@propertydefheight(self):returnself._height@height.setterdefheight(self,height):if(height<=0):print('height必须为正值,设置失败')else:print('height设置成功')self._height=height@propertydefarea(self):returnself.width*self.heightclassSquare(Rectangle):def__init__(self,width):super().__init__(width,width)@Rectangle.height.setterdefheight(self,height):if(height<=0):print('height必须为正值,设置失败')else:print('height设置成功')self._height=heightself._width=height@Rectangle.width.setterdefwidth(self,width):if(width<=0):print('width必须为正值,设置失败')else:print('width设置成功')self._width=widthself._height=widthb=Square(4)print(b.width)print(b.height)b.width=-5#输出错误提示b.width=5b.height=0#输出错误提示b.height=2print(b.area)#返回4b.area=12#输出“AttributeError:can'tsetattribute”8.继承内建的字符串类,实现对字符串的左右循环移动给定整数位(正数代表左移,负数代表右移)。【参考答案】classMoveableStr(str):defmove(self,n):temp=n%len(self)returnself[temp:]+self[:temp]if__name__=='__main__':a=MoveableStr("abcde")print(a.move(3))#输出deabcprint(a.move(-3))#输出cdeab9.请用继承的方法完成习题6的要求。【参考答案】classPoint:def__init__(self,x,y):self.x=xself.y=ydef__str__(self):return'Point('+str(self.x)+','+str(self.y)+')'classPoint1(Point):def__add__(self,other):returnPoint1(self.x+other.x,self.y+other.y)def__sub__(self,other):returnPoint1(self.x-other.x,self.y-other.y)def__mul__(self,n):returnPoint1(self.x*n,self.y*n)def__truediv__(self,n):returnPoint1(self.x/n,self.y/n)if__name__=='__main__':#这是测试代码a,b=Point1(4,5),Point1(2,3)print(a+b)#输出结果为'Point(6,8)'print(a-b)#输出结果为'Point(2,2)'print(a*2)#输出结果为'Point(8,10)'print(a/2)#输出结果为'Point(2.0,2.5)'10.考虑如下一个简单的图形绘制程序。定义一个Point类表示二维平面上的点(可以借鉴第6题)。所有图形实体的基类为Shape,其包含一个Point类型的position实例属性,用于表示图形的位置。Shape类有一个方法move_to将图形的位置移动到新的位置,shape还包括一个draw方法,打印输出Shape对象的字符串表示。继承Shape类的具体图形类型包括线段类Line和圆类Circle。Line类初始化的第一个参数为一个端点,也是其位置,另一个参数表示另一个端点,作为另一个实例属性。Circle类初始化的第一个参数表示其圆心,也是其位置,另一个参数表示其半径,作为另一个实例属性。如下的代码已经给出了Shape类的定义,请完成Point类、Line类和Circle类的定义。Line类需要重写move_to方法,在移动位置的同时修改另一个端点的坐标。另外,Line类和Circle类都要求对__str__重写实现,以得到更直观的draw效果,其中类Line的输出信息样式为“Line:第一个端点的坐标--第二个端点的坐标)”,类Circle的输出信息样式为“Circlecenter:圆心坐标,R=半径”。部分例程和测试代码如下:#请实现类Point、Line、CircleclassShape: #不要修改该类def__init__(self):self.position=Point(0,0)defdraw(self):print(str(self))defmove_to(self,position):print("movingto",str(position))self.position=position#下面是测试代码if__name__=='__main__':l=Line(Point(0,0),Point(20,20))l.draw()l.move_to(Point(3,5))#移动到一个新的点l.draw()c=Circle(Point(10,10),5)c.draw()c.move_to(Point(30,20))c.draw()#下面是脚本的期望输出Line:(0,0)(20,20)movingto(3,5)Line:(3,5)(23,25)Circlecenter:(10,10),R=5movingto(30,20)Circlecenter:(30,20),R=5【参考答案】classPoint:def__init__(self,x,y):self.x=xself.y=ydef__str__(self):return'('+str(self.x)+','+str(self.y)+')'def__add__(self
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年邮局面试与笔试问题解答集
- 2026年职场英语技能提升与模拟试题
- 2026年地震数据处理分析岗笔试题
- 2026年沃尔玛财务档案管理面试题详解
- 2026年乡镇农产品产地初加工技术题
- 2026年中国法律体系及其案例解析
- 2026年农产品产销对接服务知识竞赛
- 2026年示范区美术馆联展题库
- 2025年医药行业药品注册管理及备考要点及真题解析题库冲刺卷
- 个人家庭煤气泄漏紧急处理预案
- 2026年3月山东济南轨道交通集团运营有限公司社会招聘备考题库附参考答案详解【轻巧夺冠】
- 2026贵州黔东南州凯里市第一中学开展急需紧缺人才引进18人笔试备考题库及答案解析
- 2026江西南昌市公安局东湖分局招聘警务辅助人员30人备考题库(各地真题)附答案详解
- 第13课 每个人都有梦想 第一课时 课件(内置视频)-2025-2026学年道德与法治二年级下册统编版
- 涉税专业机构内部制度
- B站BiliiliWorld招商策划通案
- 2026中国海洋大学管理服务岗位人员招聘7人(山东)笔试备考题库及答案解析
- 危重患者护理质量评价标准
- 张家口市重点中学2025-2026学年高考第一次模拟测试英语试题含解析
- 质量检验与控制标准(标准版)
- 2025年10月自考13887经济学原理中级试题及答案
评论
0/150
提交评论