一、实验目的
(1)掌握类的继承和重载方法
(2)熟悉自定义异常;
(3)熟悉异常处理
二、实 验 内 容
1、现有父类class Dimension,内容如下:
class Dimension: #定义类Dimensions
def __init__(self, x, y): #构造函数
self.x = x #x坐标
self.y = y #y坐标
def area(self):
pass
def draw(self):
pass
请写出该类的两个子类class Circle和class Rectangle,要求如下:
(1)Circle子类有自己的新属性半径r,Rectangle子类有自己的新属性w(长),h(宽);
(2)每个子类重写area()和draw()方法。area()方法计算图形的面积,draw()用turtle模块画出图形,要求画图形时以坐标(x,y)为图形的中心。
(3)编写测试代码,根据参数分别求出两种图形的面积,并画出矩形的图形。
代码如下:
import turtle as t
class Dimension:
def __init__(self, x, y):
self.x = x #x坐标
self.y = y #y坐标
def area(self):
pass
def draw(self):
pass
class Circle(Dimension):
def __init__(self,x,y,r):
self.r=r
Dimension.__init__(self,x,y)
def area(self):
self.area=3.14*pow(50,2)
print("圆的半径为{},圆的面积为{}".format(self.r,self.area))
def draw(self):
pass
class Rectangle(Dimension):
def __init__(self,x,y,w,h):
self.w=w
self.h=h
Dimension.__init__(self,x,y)
def area(self):
self.area=self.w*self.h
print("矩形的长为{},宽为{},面积为{}".format(self.w,self.h,self.area))
def draw(self):
t.penup()
t.goto(self.x, self.y)
t.pendown()
t.forward(self.w)
t.right(90)
t.forward(self.h)
t.right(90)
t.forward(self.w)
t.right(90)
t.forward(self.h)
t.hideturtle()
t.done()
s1=Circle(2,2,50)
s1.area()
s2=Rectangle(2,2,60,40)
s2.area()
s2.draw()
执行效果:
2、编写一个 Student学生类,要求如下: (1) 属性有:id、name、score (2) 运算符重载+:实现两个对象相加时,默认返回他们的成绩和 (3) 构造方法要求:输入 name、salary,不输入 id。(3)类方法prod_id()实现id自增的方式赋值,从 1000 开 始自增,第一个新增对象是 1001,第二个新增对象是 1002。
测试代码如下:
p1 = Student(' ', "张三", 67)
p1.prod_id()
print("{0}的id号{1}".format(p1.name,p1.id))
p2 = Student(' ', "李四", 78)
p2.prod_id()
print("{0}的id号{1}".format(p2.name,p2.id))
print("{0}和{1}的成绩总和为:{2}".format(p1.name,p2.name,p1 + p2))
p3 = Student(' ',"王五",89)
p3.prod_id()
print("王五的id号",p3.id)
代码如下:
class Student:
id=1000
def __init__(self,id,name,score):
self.id=Student.id
self.name=name
self.score=score
def prod_id(self):
Student.id+=1
def __add__(self, other):
if isinstance(other,Student): # isinstance() 函数来判断一个对象是否是一个已知的类型
return self.score+other.score
else:
return "不是同类对象,不能相加"
p1 = Student(' ', "张三", 67)
p1.prod_id()
print("{0}的id号:{1}".format(p1.name,p1.id))
p2 = Student(' ', "李四", 78)
p2.prod_id()
print("{0}的id号:{1}".format(p2.name,p2.id))
print("{0}和{1}的成绩总和为:{2}".format(p1.name,p2.name,p1 + p2))
p3 = Student(' ',"王五",89)
p3.prod_id()
print("王五的id号:",p3.id)
执行效果:
3、编写程序模拟猜数游戏。程序运行时,系统生成一个1~10的随机数,然后提示用户进行猜测, 并根据用户输入进行必要的提示(猜对了、太大了、太小了),如果猜对则提前结束程序, 如果3次次数用完仍没有猜对,提示游戏结束并给出正确答案。提示:用try-except-else的异常处理结构约束用户输入必须是数字。执行效果如下图:
代码如下:
import random
def GuessNumber():
value=random.randint(0, 10)
for i in range(1,4):
print("第",i,"次输入")
try:
a=int(input("请输入一个数:"))
except ValueError:
print("Must input an integer between 1 and 10")
else:
if a>value:
print("Too big")
elif a< value:
print("Too small")
else:
print("Congratulation!")
break
else:
print("The vale is:{}".format(value))
GuessNumber()
输出结果:
4、自定义一个异常类class AgeError(Exception),该类可以检测输入的年龄是否在18到60岁之间,在类内重写__str()__方法返回错误提示。并编写测试代码,若出现输入年龄不在范围内则抛出异常。执行效果如图:
代码如下:
class AgeError(Exception):
def __init__(self,age):
Exception.__init__(self)
self.age=age
def __str__(self):
return str(self.age)+"年龄错误!应该在18-60之间"
age=int(input("输入一个年龄:"))
if age<18 or age>60:
raise AgeError(age)
else:
print("正常的年龄:",age)
测试结果如图:
5、在4题基础上,抛出异常后用try异常处理语句处理,给出错误提示,效果如图:
代码如下:
class AgeError(Exception):
def __init__(self,age):
Exception.__init__(self)
self.age=age
def __str__(self):
return str(self.age)+"年龄错误!应该在18-60之间"
try:
age=int(input("输入一个年龄:"))
if age<18 or age>60:
raise AgeError(age)
except AgeError:
print(age,",年龄错误!应该在18-60之间")
else:
if 18<age<60:
print("正常的年龄:",age)
测试结果如图:
6.自定义异常类NumberError(Exception),能够检查列表中的数字是否有小于零的非法数值,在类内重写__str()__方法返回错误提示。编写一个函数total()统计参数列表中的元素值之和,当列表元素中有小于零的数值抛出异常。编写测试代码输入三组数,当每组数都是正数是计算元素的和,若某组数中有非法数值(<0)则进行异常处理,输出错误提示。
代码如下:
class NumberError(Exception):
def __init__(self,data):
Exception.__init__(self, data)
self.data =data
def __str__(self): #重载__str__方法
return self.data+":非法数值(<0)"
def total(data):
total = 0
for i in data:
if i < 0:
raise NumberError(str(i))
total+=i
return total
#测试代码
for i in range(3):
try:
data=list(map(int,input("输入整数用逗号隔开").split(',')))
print('总计=',total(data))
except NumberError as e:
print(e)
测试结果如图:
三、实 验 总 结
1、Python异常处理try except else的执行流程。
2、自定义异常如何抛出。
3、总结实验中的问题。