2023.3.23

实验目的

l 使学生掌握Python下类与对象的基本应用;

l 使学生掌握Python下继承与多态的基本应用;

l 使学生掌握Python接口的基本应用;

l 使学生掌握Python异常处理的基本应用;

实验环境及实验准备

l 所需软件环境为Pyhton 3.x

l 掌握Python下类与对象、继承与多态的基本概念与应用;

l 掌握Python下接口的基本概念与应用;

l 掌握Python下异常处理的基本概念与应用

实验内容

(一)、设计高校人员信息包,并完成测试

题目描述定义一个人员类People,其属性有:姓名、性别、年龄;基于People实现学生类Student,添加属性:学号、入学时间和入学成绩;基于People实现教师类Teacher,添加属性:职务、部门、工作时间;基于Student实现究生类Graduate,添加属性:研究方向和导师,分别定义其中的构造函数和输出函数。程序中定义各种类的对象,并完成测试。 基于以上类利用接口实现在职研究生类 GradOnWork

【源代码程序】

class People:

    def __init__(self, name='qaz', gender='男', age=21):

        self.name = name

        self.gender = gender

        self.age = age

 

    def display(self):

        print("姓名:" + self.name + "\n性别:" + self.gender + "\n年龄:" + str(self.age))

 

 

class Student(People):

    def __init__(self, student_id="20210001", into_time="2021-09-01", into_score="100.0"):

        People.__init__(self, name='qaz', gender='男', age=21)

        self.student_id = student_id

        self.into_time = into_time

        self.into_score = into_score

 

    def display(self):

        print("姓名:" + self.name + "\n性别:" + self.gender + "\n年龄:" + str(

            self.age) + "\n学号:" + self.student_id + "\n入学时间:" + self.into_time + "\n入学成绩:" + str(self.into_score))

 

 

class Teacher(People):

    def __init__(self, post="院长", department="软件工程学院", job_time="2000-1-01"):

        People.__init__(self, name='wsx', gender='男', age=40)

        self.post = post

        self.department = department

        self.job_time = job_time

 

    def display(self):

        print("姓名:" + self.name + "\n性别:" + self.gender + "\n年龄:" + str(

            self.age) + "\n职务:" + self.post + "\n部门:" + self.department + "\n工作时间:" + self.job_time)

 

 

class Graduate(Student):

    def __init__(self, research_fields="人工智能", teacher="wjm"):

        Student.__init__(self, student_id="20210002", into_time="2021-09-01", into_score="60.0")

        self.research_fields = research_fields

        self.teacher = teacher

 

    def display(self):

        print("姓名:" + self.name + "\n性别:" + self.gender + "\n年龄:" + str(

            self.age) + "\n学号:" + self.student_id + "\n入学时间:" + self.into_time + "\n入学成绩:" + str(

            self.into_score) + "\n研究方向:" + self.research_fields + "\n导师:" + self.teacher)

 

 

class GradOnWork(Teacher, Graduate):

    def __init__(self):

        Teacher.__init__(self, post="辅导员", department="软件工程学院", job_time="2000-1-01")

        Graduate.__init__(self, research_fields="人工智能", teacher="wjm")

 

    def display(self):

        print("姓名:" + self.name + "\n性别:" + self.gender + "\n年龄:" + str(

            self.age) + "\n职务:" + self.post + "\n部门:" + self.department + "\n工作时间:" + self.job_time + "\n学号:" + self.student_id + "\n入学时间:" + self.into_time + "\n入学成绩:" + str(

            self.into_score) + "\n研究方向:" + self.research_fields + "\n导师:" + self.teacher)

p = People() # 人员类

p.display()

s = Student() # 学生类

s.display()

t = Teacher() # 教师类

t.display()

g = Graduate() # 研究生类

g.display()

gw = GradOnWork() # 在职研究生类

gw.display()

 

 

运行测试

 

(二)、以圆类为基础设计三维图形体系

题目描述设计三维图形类体系,要求如下:

设计三维图形功能接口,接口包含周长、面积、体积计算方法;

基于以上接口,首先定义点类,包含xy坐标数据成员,坐标获取及设置方法、显示方法等

以点基类派生圆类,增加表示半径的数据成员,半径获取及设置方法,重载显示函数,并可计算周长和面积等

以圆类为基础派生球类、圆柱类、圆锥类;要求派生类球、圆柱、圆锥中都含有输入和输出显示方法;并可计算面积、周长。

程序中定义各种类的对象,并完成测试。

【源代码程序】

import math

class Shape:

    def cal_perimeter(self):

        pass

    def cal_area(self):

        pass

    def cal_volume(self):

        pass

class Point(Shape):

    def __init__(self,x=0,y=0):

        self.x = x

        self.y = y

    def setX(self,x):

        self.x = x

    def setY(self,y):

        self.y = y

    def getX(self):

        return self.x

    def getY(self):

        return self.y

    def display(self):

        print('({}'.format(self.x)+',{})'.format(self.y))

class Circle(Point):

    def __init__(self,r):

        Point.__init__(self,x=0,y=0)

        self.r = r

    def setR(self,r):

        self.r = r

    def getR(self):

        return self.r

    def cal_perimeter(self):

        perimeter=round(2*3.14*self.r,2)

        return perimeter

    def cal_area(self):

        area=round(3.14*self.r**2,2)

        return area

    def display(self):

        print('圆的周长:',self.cal_perimeter())

        print('圆的面积:',self.cal_area())

class Ball(Circle):

    def __init__(self,r):

        Circle.__init__(self,r=10)

    def cal_volume(self):

        perimeter=round((4/3)*3.14*(self.r**3),2)

        return perimeter

    def cal_area(self):

        area=round(3.14*self.r**2*4,2)

        return area

    def display(self):

        print('球的体积:',self.cal_volume())

        print('球的面积:',self.cal_area())

class Circular(Circle):

    def __init__(self,r,h):

        Circle.__init__(self,r=10)

        self.h = h

    def cal_volume(self):

        perimeter=round(3.14*(self.r**2)*self.h,2)

        return perimeter

    def cal_area(self):

        area=round(3.14*2*self.r*self.h+2*3.14*self.r**2,2)

        return area

    def display(self):

        print('圆柱的体积:',self.cal_volume())

        print('圆柱的面积:',self.cal_area())

class CircularCone(Circle):

    def __init__(self,r,h):

        Circle.__init__(self,r=10)

        self.h = h

    def cal_volume(self):

        perimeter=round((1/3)*3.14*(self.r**2)*self.h,2)

        return perimeter

    def cal_area(self):

        area=round(3.14*self.r*(self.r+math.sqrt(self.r**2+self.h**2)),2)

        return area

    def display(self):

        print('圆锥的体积:',self.cal_volume())

        print('圆锥的面积:',self.cal_area())

 

 

p = Point(10,5)

p.display()

 

c = Circle(10)

c.display()

 

r = float(input("请输入球体半径:"))

b = Ball(r)

b.display()

 

r = float(input("请输入圆柱底面半径:"))

h = float(input("请输入圆柱的高:"))

cc = Circular(r,h)

cc.display()

 

r = float(input("请输入圆锥底面半径:"))

h = float(input("请输入圆锥的高:"))

cn = CircularCone(r,h)

cn.display()

运行测试

 

(三)、设计并实现计算不同职称的教师工资

题目描述设计教师接口,该接口包含教师工资计算方法。应用(一)中的高校人员信息包,设计不同职称的教师类:教授,副教授,讲师,教师的基本信息包括姓名、性别、出生年月、职称、课时工作量等属性。注意学校对教师每月工资的计算规定如下:固定工资+课时补贴;教授的固定工资为5000元,每个课时补贴50元;副教授的固定工资为3000元,每个课时补贴30元;讲师的固定工资为2000元,每个课时补贴20元。

程序中定义各种教师类的对象,并编写程序求这些教师的月工资。

【源代码程序】

class Teacher :

    def __init__(self, name,gender,birth,zhicheng,work):

        self.name = name

        self.gender = gender

        self.birth = birth

        self.zhicheng = zhicheng

        self.work = work

    def income(self):

        if self.zhicheng == "教授":

            return self.work*50+5000

        elif self.zhicheng == "副教授":

            return self.work*30+3000

        elif self.zhicheng == "讲师":

            return self.work*20+2000

    def display(self):

        print( self.name+self.zhicheng+"的工资:"+str(Teacher.income(self)))

class Professor(Teacher) :

    def __init__(self):

        Teacher.__init__(self,name = 'Taylor',gender = '女',birth="1989-12-13",zhicheng="教授",work=5)

class Professor_Fu(Teacher) :

    def __init__(self):

        Teacher.__init__(self, name = 'Charlie',gender = '男',birth="1990-05-07",zhicheng="副教授",work=5)

class Instructor(Teacher) :

    def __init__(self):

        Teacher.__init__(self, name = 'Tom',gender = '男',birth="1998-02-06",zhicheng="讲师",work=5)

        

p = Professor()

p.display()

pf = Professor_Fu()

pf.display()

i = Instructor()

i.display()

运行测试

 

(四)、设计异常处理Cexception,并基于异常处理类设计并实现日期类Date

题目描述

题目描述

定义一个异常类Cexception解决日期类实现中的自定义异常处理。设计的日期类应包含以下内容:

①  有三个成员数据:年、月、日;

②  有设置日期的成员函数;

③  有用格式"月/日/年"输出日期的成员函数;

④  要求在日期设置及有参构造函数中添加异常处理。

【源代码程序】

class Cexception :

    def __init__(self,year,month,day):

        if Cexception.judge(year,month,day) :

            self.year = year

            self.month = month

            self.day = day

        else:

            self.year = -1

            self.month = -1

            self.day = -1

            print("日期有误")

    def setTime(self,year,month,day):

        if Cexception.judge(year,month,day) :

            self.year = year

            self.month = month

            self.day = day

        else:

            self.year = -1

            self.month = -1

            self.day = -1

            print("日期有误")

    def display(self):

        if self.month ==-1 or  self.year == -1 or self.day == -1:

            print("",end="")

        else:

            print(str(self.month)+"/"+str(self.day)+"/"+str(self.year))

    def judge(year,month,day):

        leap = False

        legal = False

        if year>0:

            if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:

                leap = True

            if month in [1, 3, 5, 7, 8, 10, 12]:

                if 1 <= day <= 31:

                    legal = True

            elif month in [4, 6, 9, 11]:

                if 1 <= day <= 30:

                    legal = True

            elif month == 2:

                if not leap and 1 <= day <= 28:

                    legal = True

                elif leap and 1 <= day <= 29:

                    legal = True

        else:

            legal = False

        return legal

 

c = Cexception(-1,11,2)

c.display()

c = Cexception(2019,11,2)

c.display()

c = Cexception(2019,2,29)

c.display()

c = Cexception(2020,2,29)

c.display()

运行测试

 

)、设计并实现平面点类Point

题目描述

定义一个平面点类Point,对其重载运算符关系运算符,关系运算以距离坐标原点的远近作为基准,远的为大。程序完成对其的测试。

【源代码程序】

import math

class Point():

    def __init__(self,x,y):

        self.x = x

        self.y = y

    def __lt__(self, other):

        l1 = math.sqrt(self.x**2+self.y**2)

        l2 = math.sqrt(other.x**2+other.y**2)

        return l1<l2

    def __le__(self, other):

        l1 = math.sqrt(self.x**2+self.y**2)

        l2 = math.sqrt(other.x**2+other.y**2)

        return l1<=l2

    def __gt__(self, other):

        l1 = math.sqrt(self.x**2+self.y**2)

        l2 = math.sqrt(other.x**2+other.y**2)

        return l1>l2

    def __ge__(self, other):

        l1 = math.sqrt(self.x**2+self.y**2)

        l2 = math.sqrt(other.x**2+other.y**2)

        return l1>=l2

    def __eq__(self, other):

        l1 = math.sqrt(self.x**2+self.y**2)

        l2 = math.sqrt(other.x**2+other.y**2)

        return l1==l2

    def __ne__(self, other):

        l1 = math.sqrt(self.x**2+self.y**2)

        l2 = math.sqrt(other.x**2+other.y**2)

        return l1!=l2

 

p1 = Point(1,2)

p2 = Point(3,4)

p=p1<p2

print(p)

p=p1<=p2

print(p)

p=p1>p2

print(p)

p=p1>=p2

print(p)

p=p1==p2

print(p)

p=p1!=p2

print(p)

运行测试

 

实验分析及问题思考

结合实例,比较Python与Java在类的定义、继承、多态等方面的异同,总结Python面向对象程序设计中的原则和注意事项。

【答案】

Java ,python面向对象的继承及其区别

JAVA

JAVA继承基本样式  

 

class Demo extends Object{

    Demo(int a){

        this();

    }

    Demo(){

        super();

    }

}

 

java默认继承Object 类, 并一定会在构造函数中调用super()方法,对父类进行实例化。注意:this()和super()不能同时出现在同一个构造函数中,但super()必须在其中一个构造函数中出现!

 

Java实例化过程

  1. 运行父类的静态代码部分
  2. 再运行子类的静态代码部分
  3. 执行父类成员代码
  4. 执行父类构造函数 —— 父类完成实例化
  5. 执行子类的成员代码块
  6. 执行子类的构造函数 ——子类实例化完成

 

 

# 先执行静态代码部分,包括静态变量声明赋值,静态代码块等。

# !进行默认初始化(变量声明,默认为null 0)

# 调用构造函数

# 通过子类构造函数调用父类的构造函数进行初始化——父类弹栈

# !进行子类的显示初始化

# 子类特定函数的特定初始化

# 内存地址赋值给变量

 

 

PYTHON

PYTHON继承基本样式

class Demo(object):

    def __init__(self,a):

        super().__init__()

        self.a = a

python 实例化过程同java,默认继承object,需要对父类进行实例化。

Python实例化过程

  1. 执行父类的静态代码
  2. 执行子类的静态代码
  3. 执行子类__new__()方法
  4. 在子类__new__() 方法中调用父类__new__()方法
  5. 调用父类__init__()方法(父类实例化完成)
  6. 调用子类__init__()方法(子类实例化完成)

 

 

class Demo(object):

    # print("父类静态")

    def __new__(cls, *args, **kwargs):

        # print("父类new")

        return object.__new__(cls)

    def __init__(self,a):

        # print("父类init")

        super().__init__()

        self.a = a

class A(Demo):

    def __new__(cls, *args, **kwargs):

        # print("子类new")   

        super().__new__(Demo)   #注意:这里默认调用父类的new,可以不写且不调用父类new方法。同样可以达到继承的效果

        return object.__new__(cls)

    # print("子类静态")

    def __init__(self):

        super().__init__(1)

        # print("子类init")

A()

 

 

 

对比

  继承

  Java   对象在调用父类中方法时,该方法调用的方法会优先使用子类的方法,调用的成员变量会优先调用父类的变量。

  Python  对象在调用父类中方法时,调用的方法和变量都优先调用子类的方法和变量。

 

  多态

  python天生多态

  java:因为涉及到变量属性的问题,必须对对象进行降级和转换才能使用子类的方法和属性。

 

Animal a = new Cat();//a并不能使用Cat类的功能,所有属性和方法都是Animal父类的

Cat c = (Cat)a; //才能使用

 

以上例为例,在变量类型是实例类型的父类或者接口的时候,编译和运行存在差别:

  1. 成员变量:在编译和运行都参考Animal = 的左边!
  2. 方法:编译参考Animal = 左边,父类有才编译通过,运行优先参考Cat即参考=右边。(在重名的情况下依然使用的是子类的方法,但是如果调用父类没有的方法,是无法编译通过的。)
  3. 静态部分: 因为不需要对象,也不存在this,都是参考Animal即=左边!

 

 

 

 


Python面向对象基础训练

班级:          学号:         姓名:

实验自评

实验内容

自评结果(在对应格内打ü

不熟练

一般

比较熟练

熟练

Pyhton类的定义

 

ü

 

 

Pyhton类的继承

 

ü

 

 

Python多态实现

 

ü

 

 

Python接口实现

 

ü

 

 

Python自定义异常结构

ü

 

 

 

实验体会

在学习Python面向对象编程时,我进行了一些基础的实验训练,下面分享一下我的体会。

首先,学习Python面向对象编程需要理解一些基本概念,包括类、对象、属性和方法等。这些概念是构建面向对象程序的基石,因此要花时间逐一掌握。

其次,在进行实验训练时,我发现最好从简单的例子开始,例如创建一个简单的类并为其添加一些属性和方法。这样可以帮助我们更好地理解面向对象编程的原理和实践。

在实验中,我也遇到了一些挑战。例如,在设计类时需要考虑如何合理地组织数据和功能,并确保代码具有可读性和可维护性。此外,当我们调用类的方法时,也需要注意参数的传递和返回值的处理。

最后,我认为实验训练对于掌握Python面向对象编程非常重要。通过实际操作,我们可以更深入地了解该编程范式的核心思想和实践技巧。同时,实验训练也可以帮助我们加深对面向对象编程的理解,从而更好地应用到实际开发中。

总之,通过实验训练,我对Python面向对象编程有了更深刻的认识和理解,也更加熟悉了这种编程方式的基本原理和实践技巧。

 

posted @ 2023-03-23 21:29  与孤独对酌  阅读(40)  评论(0)    收藏  举报