python实现大学人员管理系统


Posted in Python onOctober 25, 2019

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

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

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

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

import datetime

class PersonValueError(ValueError):
 pass
class PersonTypeError(TypeError):
 pass

class 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中__call__方法示例分析
Oct 11 Python
Python自定义装饰器原理与用法实例分析
Jul 16 Python
Django框架模板注入操作示例【变量传递到模板】
Dec 19 Python
使用Python实现毫秒级抢单功能
Jun 06 Python
Python字符串的修改方法实例
Dec 19 Python
Pycharm中import torch报错的快速解决方法
Mar 05 Python
TensorFlow的reshape操作 tf.reshape的实现
Apr 19 Python
基于keras中的回调函数用法说明
Jun 17 Python
详解使用Python写一个向数据库填充数据的小工具(推荐)
Sep 11 Python
Python操作word文档插入图片和表格的实例演示
Oct 25 Python
Python移位密码、仿射变换解密实例代码
Jun 27 Python
关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)
Apr 04 Python
Python队列、进程间通信、线程案例
Oct 25 #Python
python银行系统实现源码
Oct 25 #Python
python Event事件、进程池与线程池、协程解析
Oct 25 #Python
python实现简单银行管理系统
Oct 25 #Python
Python银行系统实战源码
Oct 25 #Python
python实现银行管理系统
Oct 25 #Python
Django视图扩展类知识点详解
Oct 25 #Python
You might like
一个简单的PHP投票程序源码
2007/03/11 PHP
php empty,isset,is_null判断比较(差异与异同)
2010/10/19 PHP
IP攻击升级,程序改进以对付新的攻击
2010/11/23 PHP
PHP命名空间(Namespace)的使用详解
2013/05/04 PHP
PHP date函数常用时间处理方法
2015/05/11 PHP
PHP实现原比例生成缩略图的方法
2016/02/03 PHP
php 常用的系统函数
2017/02/07 PHP
SWFObject 2.1以上版本语法介绍
2010/07/10 Javascript
JavaScript 对任意元素,自定义右键菜单的实现方法
2013/05/08 Javascript
js无刷新操作table的行和列
2014/03/27 Javascript
jQuery搜索同辈元素方法
2015/02/10 Javascript
JavaScript中的parse()方法使用简介
2015/06/12 Javascript
js轮盘抽奖实例分析
2020/04/17 Javascript
AngularJS 与百度地图的结合实例
2016/10/20 Javascript
关于express与koa的使用对比详解
2018/01/25 Javascript
Vue波纹按钮组件制作
2018/04/30 Javascript
Vue框架TypeScript装饰器使用指南小结
2019/02/18 Javascript
原生JS实现弹幕效果的简单操作指南
2020/11/10 Javascript
[05:08]顺网杯ISS-DOTA2赛歌 少女偶像Lunar青春演绎
2013/12/05 DOTA
Python在Windows和在Linux下调用动态链接库的教程
2015/08/18 Python
Python使用paramiko操作linux的方法讲解
2019/02/25 Python
python之信息加密题目详解
2019/06/26 Python
python如何解析配置文件并应用到项目中
2019/06/27 Python
一行python实现树形结构的方法
2019/08/09 Python
Python中的相关分析correlation analysis的实现
2019/08/29 Python
Python基于数列实现购物车程序过程详解
2020/06/09 Python
Scrapy模拟登录赶集网的实现代码
2020/07/07 Python
python计算auc的方法
2020/09/09 Python
python合并多个excel文件的示例
2020/09/23 Python
Django 权限管理(permissions)与用户组(group)详解
2020/11/30 Python
印尼旅游网站:via
2017/11/12 全球购物
先进班级集体事迹材料
2014/01/30 职场文书
支部书记四风问题自我剖析材料
2014/09/29 职场文书
2015年复活节活动总结
2015/02/27 职场文书
新学期开学标语2015
2015/07/16 职场文书
Java 中的 Lambda List 转 Map 的多种方法详解
2022/07/07 Java/Android