实验七 Python类的继承重载及异常处理

 一、实验目的

(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、总结实验中的问题。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值