首页 > 其他分享 >5.16

5.16

时间:2024-06-05 09:22:05浏览次数:21  
标签:__ self init 5.16 print display def

Python面向对象基础训练

班级: 信2205-1 学号:20224074  姓名:王晨宇

实验目的

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, gender, age):

        self.name = name

        self.gender = gender

        self.age = age

 

    def display_info(self):

        print(f"Name: {self.name}, Gender: {self.gender}, Age: {self.age}")

 

 

class Student(People):

    def __init__(self, name, gender, age, student_id, enrollment_date, entrance_score):

        super().__init__(name, gender, age)

        self.student_id = student_id

        self.enrollment_date = enrollment_date

        self.entrance_score = entrance_score

 

    def display_info(self):

        super().display_info()

        print(f"Student ID: {self.student_id}, Enrollment Date: {self.enrollment_date}, Entrance Score: {self.entrance_score}")

 

 

class Teacher(People):

    def __init__(self, name, gender, age, position, department, work_experience):

        super().__init__(name, gender, age)

        self.position = position

        self.department = department

        self.work_experience = work_experience

 

    def display_info(self):

        super().display_info()

        print(f"Position: {self.position}, Department: {self.department}, Work Experience: {self.work_experience}")

 

 

class Graduate(Student):

    def __init__(self, name, gender, age, student_id, enrollment_date, entrance_score, research_area, advisor):

        super().__init__(name, gender, age, student_id, enrollment_date, entrance_score)

        self.research_area = research_area

        self.advisor = advisor

 

    def display_info(self):

        super().display_info()

        print(f"Research Area: {self.research_area}, Advisor: {self.advisor}")

 

 

class GradOnWork(Graduate):

    def __init__(self, name, gender, age, student_id, enrollment_date, entrance_score, research_area, advisor, company):

        super().__init__(name, gender, age, student_id, enrollment_date, entrance_score, research_area, advisor)

        self.company = company

 

    def display_info(self):

        super().display_info()

        print(f"Currently working at: {self.company}")

 

 

# 创建对象并测试

student1 = Student("Alice", "Female", 20, "S001", "2021-09-01", 95)

teacher1 = Teacher("Bob", "Male", 35, "Professor", "Computer Science", "10 years")

graduate1 = Graduate("Charlie", "Male", 25, "G001", "2019-09-01", 90, "Machine Learning", "Dr. Smith")

grad_on_work1 = GradOnWork("David", "Male", 28, "G002", "2018-09-01", 88, "Data Science", "Dr. Johnson", "Tech Corp")

 

student1.display_info()

print("\n")

teacher1.display_info()

print("\n")

graduate1.display_info()

print("\n")

grad_on_work1.display_info()

【运行测试

 

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

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

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

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

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

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

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

【源代码程序】

import math

 

# 三维图形功能接口

class ThreeDimensionalShape:

    def calculate_perimeter(self):

        pass

 

    def calculate_area(self):

        pass

 

    def calculate_volume(self):

        pass

 

 

# 点类

class Point:

    def __init__(self, x, y):

        self.x = x

        self.y = y

 

    def get_coordinates(self):

        return self.x, self.y

 

    def set_coordinates(self, x, y):

        self.x = x

        self.y = y

 

    def display(self):

        print(f"Point coordinates: ({self.x}, {self.y})")

 

 

# 圆类

class Circle(Point):

    def __init__(self, x, y, radius):

        super().__init__(x, y)

        self.radius = radius

 

    def calculate_perimeter(self):

        return 2 * math.pi * self.radius

 

    def calculate_area(self):

        return math.pi * self.radius ** 2

 

    def display(self):

        super().display()

        print(f"Radius: {self.radius}")

        print(f"Perimeter: {self.calculate_perimeter()}")

        print(f"Area: {self.calculate_area()}")

 

 

# 球类

class Sphere(Circle):

    def __init__(self, x, y, radius):

        super().__init__(x, y, radius)

 

    def calculate_volume(self):

        return (4/3) * math.pi * self.radius ** 3

 

    def display(self):

        super().display()

        print(f"Volume: {self.calculate_volume()}")

 

 

# 圆柱类

class Cylinder(Circle):

    def __init__(self, x, y, radius, height):

        super().__init__(x, y, radius)

        self.height = height

 

    def calculate_volume(self):

        return math.pi * self.radius ** 2 * self.height

 

    def display(self):

        super().display()

        print(f"Height: {self.height}")

        print(f"Volume: {self.calculate_volume()}")

 

 

# 圆锥类

class Cone(Circle):

    def __init__(self, x, y, radius, height):

        super().__init__(x, y, radius)

        self.height = height

 

    def calculate_volume(self):

        return (1/3) * math.pi * self.radius ** 2 * self.height

 

    def display(self):

        super().display()

        print(f"Height: {self.height}")

        print(f"Volume: {self.calculate_volume()}")

 

 

# 创建对象并测试

point1 = Point(1, 2)

point1.display()

 

circle1 = Circle(0, 0, 5)

circle1.display()

 

sphere1 = Sphere(0, 0, 5)

sphere1.display()

 

cylinder1 = Cylinder(0, 0, 5, 10)

cylinder1.display()

 

cone1 = Cone(0, 0, 5, 10)

cone1.display()

【运行测试

 

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

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

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

【源代码程序】

# 教师接口

class Teacher:

    def calculate_salary(self):

        pass

 

# 教授类

class Professor(Teacher):

    def __init__(self, name, gender, birthdate, teaching_hours):

        self.name = name

        self.gender = gender

        self.birthdate = birthdate

        self.title = "教授"

        self.teaching_hours = teaching_hours

 

    def calculate_salary(self):

        fixed_salary = 5000

        hourly_allowance = 50

        total_salary = fixed_salary + self.teaching_hours * hourly_allowance

        return total_salary

 

# 副教授类

class AssociateProfessor(Teacher):

    def __init__(self, name, gender, birthdate, teaching_hours):

        self.name = name

        self.gender = gender

        self.birthdate = birthdate

        self.title = "副教授"

        self.teaching_hours = teaching_hours

 

    def calculate_salary(self):

        fixed_salary = 3000

        hourly_allowance = 30

        total_salary = fixed_salary + self.teaching_hours * hourly_allowance

        return total_salary

 

# 讲师类

class Lecturer(Teacher):

    def __init__(self, name, gender, birthdate, teaching_hours):

        self.name = name

        self.gender = gender

        self.birthdate = birthdate

        self.title = "讲师"

        self.teaching_hours = teaching_hours

 

    def calculate_salary(self):

        fixed_salary = 2000

        hourly_allowance = 20

        total_salary = fixed_salary + self.teaching_hours * hourly_allowance

        return total_salary

 

# 创建教师对象并计算月工资

professor1 = Professor("张三", "", "1980-01-01", 50)

associate_professor1 = AssociateProfessor("李四", "", "1985-05-10", 40)

lecturer1 = Lecturer("王五", "", "1990-12-15", 30)

 

print(f"{professor1.name}的月工资为:{professor1.calculate_salary()}")

print(f"{associate_professor1.name}的月工资为:{associate_professor1.calculate_salary()}")

print(f"{lecturer1.name}的月工资为:{lecturer1.calculate_salary()}")

【运行测试

 

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

题目描述】

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

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

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

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

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

【源代码程序】

# 自定义异常类

class Cexception(Exception):

    def __init__(self, message):

        self.message = message

 

# 日期类

class Date:

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

        self.year = year

        self.month = month

        self.day = day

        self.set_date(year, month, day)

 

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

        try:

            if month < 1 or month > 12:

                raise Cexception("Invalid month")

            if day < 1 or day > 31:

                raise Cexception("Invalid day")

            self.year = year

            self.month = month

            self.day = day

        except Cexception as e:

            print(f"Exception: {e.message}")

 

    def output_date(self):

        return f"{self.month}/{self.day}/{self.year}"

 

# 创建日期对象并测试异常处理

try:

    date1 = Date(2024, 5, 10)

    print(date1.output_date())

    date2 = Date(2024, 13, 40)  # 月份和日期超出范围,会触发异常处理

except Cexception as e:

    print(f"Exception occurred: {e.message}")

 

【运行测试

 

 

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

【题目描述】

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

【源代码程序】

import math

 

# 定义平面点类

class Point:

    def __init__(self, x, y):

        self.x = x

        self.y = y

 

    def distance_to_origin(self):

        return math.sqrt(self.x ** 2 + self.y ** 2)

 

    # 重载小于运算符

    def __lt__(self, other):

        return self.distance_to_origin() < other.distance_to_origin()

 

    # 重载大于运算符

    def __gt__(self, other):

        return self.distance_to_origin() > other.distance_to_origin()

 

# 创建点对象并进行测试

point1 = Point(3, 4)

point2 = Point(1, 1)

 

if point1 > point2:

    print("point1离原点更远")

elif point1 < point2:

    print("point2离原点更远")

else:

    print("point1point2到原点的距离相等")

 

【运行测试

 

 

实验分析及问题思考

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

【答案】

Python中不需要指定访问修饰符(如public、private),默认为公开访问;而Java中需要显式指定访问修饰符。

Python中可以在类中直接定义属性和方法,而Java中需要在类中定义属性和方法。Python中使用class SubClass(BaseClass)来表示继承关系,Java中使用class SubClass extends BaseClass。

Python支持多重继承,一个子类可以继承多个父类;而Java不支持多重继承,一个子类只能继承一个父类。

总结:类是对象的模板,对象是类的实例。通过类创建对象,可以对对象进行操作和访问属性和方法。避免使用全局变量:尽量将数据和方法封装在类中,避免使用全局变量,提高代码的可维护性和可重用性。允许不同的子类对象对同一方法做出不同的响应,提高代码的灵活性和可扩展性。

 

 

 


Python面向对象基础训练

班级:信2205-1 学号:20224074  姓名:王晨宇

实验自评

实验内容

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

不熟练

一般

比较熟练

熟练

Pyhton类的定义

 

 

 

ü

Pyhton类的继承

 

 

 

ü

Python多态实现

 

 

 

ü

Python接口实现

 

 

 

ü

Python自定义异常结构

 

 

 

ü

实验体会

我意识到封装、继承、多态等概念是面向对象编程的重要基础,合理运用这些概念可以提高代码的可维护性、可扩展性和可重用性。另外,避免使用全局变量、尽量将数据和方法封装在类中也是提高代码质量的重要手段。通过这次实验,我更深入地理解了Python和Java在面向对象程序设计方面的差异,也加深了对面向对象编程原则和注意事项的理解。这将有助于我更好地设计和编写面向对象的程序

标签:__,self,init,5.16,print,display,def
From: https://www.cnblogs.com/wcy1111/p/18232266

相关文章

  • 力扣2589 5.16
    原题网址:此处为链接个人难度评价:1700分析:原本的想法是按开始时间排序后遍历,然后贪心的把下一段的和这一段的放一起,发现不够放了就把不够的算出来截为新的一段。最后发现其实有后效性。正解的贪心是:按结束时间排序后(当然是升序),贪心的把本段的都放最后。每次放的时候先检查本区......
  • 5.16
    计网TCP的流量控制5.7.1利用滑动窗口实现流量控制流量控制:让发送方发送速率不要太快,让接收方来得及接收滑动窗口的单位:字节滑动窗口流量控制流程:开始时rwnd=400,每个报文段长100字节持续计时器:解决盲等死锁。只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器,若计时器到......
  • 2024.5.16鲜花/燃料不纯的火箭与璀璨夺目的陨星
    前言在阅读本篇之前,建议先阅读上一篇鲜花。正文作为星际新闻局长,审核新闻稿之类的事自然是不需要我亲自动手,所以我每天都有大把的私人时间,这时候,我就会去看看星际新闻,也算是为自己负责的节目增加一点收视率。某一天,我看见一则新闻:【数据删除】中学校领导在线上招生典礼上介......
  • 5.16
    想了一下学习记录总结该怎么总结最后还是以学习的时长来做标准了@OverridepublicvoidsummaryRecord(intplanId){List<Record>records=recordMapper.listRecord(planId);//计算时间间隔(小时longintervalInHours=0;for......
  • 5.16软工日报
    实现了博客的退出登录使用SpringSecurity框架,配合redis和token实现packagecom.huanf.controller;importcom.huanf.domain.ResponseResult;importcom.huanf.domain.User;importcom.huanf.enums.AppHttpCodeEnum;importcom.huanf.exception.SystemException;importcom......
  • 2024.5.16
    2024.5.16【就算一次也好,我想在这颗星球上尽情奔跑。】Thursday四月初九数据结构P4588TJOI2018数学计算//2024.5.16//bywhite_ice//P4588[TJOI2018]数学计算#include<bits/stdc++.h>usingnamespacestd;#defineitnlonglong#defineintlonglongconste......
  • 5.16
    糖丸了,其实是在为自己闲话创造头图。喜报,终于找回了原来闲话的感觉(?)果然还是得自己说一大堆没用的话才好啊,不能只放图(好可爱啊(bzoj4399:魔法少女LJJ非常好题,使我调到死。现在没调完,但是其实就是线段树合并,动态开点,并查集,普通线段树区间查询等等的集合,全放一起就完事......
  • 一个小小的经验帖——建于5.16
    1.常变量和宏定义常量和宏定义的常数都是用来表示在程序执行过程中不会改变的值,但它们之间有几点区别:作用域和命名空间:常量:使用 const 关键字定义的常量具有作用域和命名空间,它们在定义它们的作用域内可见,且可以通过命名空间进行限定。宏定义的常数:使用 #define 定义的......
  • 第15.16.17章学习笔记
    实际上的问题II15.1大整数的运算所有公钥中的计算都是基于大整数运算。如我们曾提及的,恰当地实现大整数运算并不是一件容易的事情。大多数的处理例程总是或多或少地与平台相关。能够通过平台特性得到的有效率提升总是难以发挥实际作用。比如,多数CPU有一种带进位加法运算(add-wi......
  • dockerfile搭建activemq5.16.5
    dockerfile搭建activemq5.16.5搭建环境最小化的centos7.5家目录下完成如下操作环境构建脚本#!/bin/bash#authorbygwl###2023-02-10docker安装配置yuminstallwgetntpdatetelnetvimnet-toolsbash-completiongccgcc-c++make-ysed-i.bak's/SELINUX=enfor......