侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

python实现大学人员管理系统

Python  /  管理员 发布于 7年前   256

python作为一个面对对象的程序设计语言,实现一个人员管理系统有自己关于类的方法。

首先,通过定义一个人员的类对象,实现对于人员公共特性的支持,公共的特性包括:姓名,性别,出生日期等,用一个Person类来表示。大学里总的来说分为两种身份的人:学生(Student)和职工(Staff),这两种有自己的特性,比如学生信息就有学号,课程,成绩等;职工有职工号,职位,薪水等。

利用python类对象的继承机制我们就可以很方便的表示这两种身份的人。

我们首先定义一个Person类,这个类用于保存共有的特性

import datetimeclass PersonValueError(ValueError): passclass PersonTypeError(TypeError): passclass Person: _num = 0 # 类属性,这个属性在类内使用(_X)属性一般默认只能在类内使用 def __init__(self, name, sex, birthday, ident): if not (isinstance(name, str) and sex in ("女", "男")):  raise PersonValueError(name, sex)  # 用于检查输入时的实参是否符合要求 try:  birthday = datetime.date(*birthday)  # *birthday表示其参数是一个可迭代的对象(元祖,列表等)  # 返回一个日期对象(year,month,day),这个date类的  # 构造函数会检查输入年月日的合法性 except:  raise PersonValueError("wrong date:", birthday) self._name = name self._sex = sex self._birthday = birthday self._id = ident Person._num += 1 def id(self):return self._id def name(self):return self._name def sex(self):return self._sex def birthday(self):return self._birthday def age(self): return (datetime.date.today().year - self._birthday.year) # 用于获取一个单体的某个信息 # 算出年龄(today方法的year属性用于给出今年) def set_name(self, name): # 修改名字 if not isinstance(name, str):  raise PersonValueError("set_name", name) self._name = name # 用于修改名字 def __lt__(self, another): # 当实例出现在小于号两边时会自动调用 # 类似的有:__gt__: 大于; __le__:小于等于; __ge__: 大于等于; # __eq__: 等于; __ne__: 不等于 if not isinstance(another, Person):  raise PersonTypeError(another) return self._id < self._id # 用于之后的排序使用  @classmethod def num(cls): return Person._num def __str__(self): return " ".join((str(self._id), self._name, self._sex, str(self._birthday))) # 运算重载符:当实例出现在print函数中时,自动调用这个方法 def details(self): return ", ".join(("编号:" + str(self._id),    "姓名:" + self._name,    "性别:" + self._sex,    "出生日期:" + str(self._birthday)))## p1 = Person("谢雨洁", "女", (1995, 7, 30), 1201510111)# p2 = Person("汪力强", "男", (1990, 2, 17), 1201380324)# p3 = Person("张子玉", "女", (1974, 10, 14), 3331747032)# p4 = Person("李国栋", "男", (1962, 5, 24), 1293848593)## plist = [p1, p2, p3, p4]# for p in plist:# print(p)# # 这里就会直接调用实例方法__str__## print("\nAfter sorting:")# plist.sort()# # 这里就调用的运算重载符__lt__(很重要的一个知识点,如何通过实例方法实现对类多个实例进行排序)# for p in plist:# print(p.details())## print("people created:", Person.num(), "\n")

以上实现了一个通用的人信息的类,接下来有学生和职工的类都是继承自这个基类。

接下来我们看学生类的实现:

提前讲一下,学生类有一个学号的自动生成函数,在类内自动调用生成学号

class Student(Person): _id_num = 0  # 下面这个类方法可以说是很经典的使用,对于初学者来说,对于深入理解类有帮助 @classmethod **def _id_gen(cls): # 自动生成学号的类内部函数(该函数只在类的内部调用) cls._id_num += 1 year = datetime.date.today().year return "1{:04}{:05}".format(year, cls._id_num) # 后面的04, 05代表是位数,不足前面补零** def __init__(self, name, sex, birthday, department): Person.__init__(self, name, sex, birthday, Student._id_gen()) # 这里通过调用之前基类的初始化函数 # 这里调用了之前定义的生成学号的类方法 self._department = department self._enroll_date = datetime.date.today() self._courses = {} #实例属性用来记录该学生的课程以及成绩 def set_course(self, course_name): self._courses[course_name] = None # 输入所有的课程 def set_score(self, course_name, score): if course_name not in self._courses:  raise PersonValueError("No this course selected:",     course_name) self._courses[course_name] = score # 当然我们对于学生的档案里首先时学生要挑选好课程,然后才有分数 # 首先判断课程在不在已选的课程表里,然后再是给他输入分数 def scores(self): return [(cname, self._courses[cname])  for cname in self._courses] # 将课程和分数用元祖的形式输出 def details(self): return ", ".join((Person.details(self),    "入学日期:" + str(self._enroll_date),    "院系:" + self._department,    "课程记录:" + str(self.scores())))# p1 = Student("谢雨洁", "女", (1995, 7, 30), "Physics")# p2 = Student("汪力强", "男", (1990, 2, 17), "Mathematics")# p3 = Student("张子玉", "女", (1974, 10, 14), "English")# p4 = Student("李国栋", "男", (1962, 5, 24), "Comp.Sci")## print(p1.details())# print(p1) # 继承的基类Person的方法

最后时职工类,职工类不像前面的学生类,可以直接调用基类的初始化函数,这里最好用super函数,进行基类方法的调用

class Staff(Person): _id_num = 0 @classmethod def _id_gen(cls, birthday): cls._id_num += 1 birth_year = datetime.date(*birthday).year return "0{:04}{:05}".format(birth_year, cls._id_num) def __init__(self, name, sex, birthday, entry_date=None): super().__init__(name, sex, birthday,Staff._id_gen(birthday)) if entry_date:  try:  self._entry_date = datetime.date(*entry_date)  except:  raise PersonValueError("Wrong date:", entry_date) else:  self._entry_date = datetime.date.today() self._salary = 1720 self._department = "未定" self._position = "未定" def set_salary(self, amount): if not type(amount) is int:  raise TypeError self._salary = amount def set_position(self, position): self._position = position def set_department(self, department): self._department = department def details(self): return ", ".join((super().details(),    "入职时间:" + str(self._entry_date),    "院系:" + self._department,    "职位:" + self._position,    "工资:" + str(self._salary)))p1 = Staff("张子玉", "女", (1974, 10, 16))p2 = Staff("李国栋", "男", (1962, 5, 24))print(p1)print(p2)p1.set_department("数学")p1.set_position("副教授")p1.set_salary(8400)print(p1.details())print(p2.details())

代码参考《数据结构与算法 python语言描述》
强推这本书,对于深入理解python很有帮助。

更多学习资料请关注专题《管理系统开发》。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    基于Python实现签到脚本过程解析
    下一条:
    Python队列、进程间通信、线程案例
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客