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中使用urllib2伪造HTTP报头的2个方法
Jul 07 Python
Python中Collections模块的Counter容器类使用教程
May 31 Python
Python中的多行注释文档编写风格汇总
Jun 16 Python
Python中str.format()详解
Mar 12 Python
Python tkinter事件高级用法实例
Jan 31 Python
Python网络爬虫中的同步与异步示例详解
Feb 03 Python
Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析
Apr 12 Python
Form表单及django的form表单的补充
Jul 25 Python
ubuntu 18.04 安装opencv3.4.5的教程(图解)
Nov 04 Python
python中sklearn的pipeline模块实例详解
May 21 Python
浅谈Python数学建模之固定费用问题
Jun 23 Python
python中if和elif的区别介绍
Nov 07 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
我常用的几个类
2006/10/09 PHP
php 无限分类的树类代码
2009/12/03 PHP
joomla jce editor 解决上传中文名文件失败问题
2013/06/09 PHP
php按百分比生成缩略图的代码分享
2014/05/10 PHP
php中创建和调用webservice接口示例
2014/07/25 PHP
javascript客户端解决方案 缓存提供程序
2010/07/14 Javascript
广泛收集的jQuery拖放插件集合
2012/04/09 Javascript
javascript + jquery实现定时修改文章标题
2014/03/19 Javascript
js的flv视频播放器插件使用方法
2015/06/23 Javascript
原生js轮播(仿慕课网)
2017/02/15 Javascript
JavaScript中双向数据绑定详解
2017/05/03 Javascript
实例详解JSON取值(key是中文或者数字)方式
2017/08/24 Javascript
vue组件父子间通信之综合练习(聊天室)
2017/11/07 Javascript
axios拦截设置和错误处理方法
2018/03/05 Javascript
详解VueJs中的V-bind指令
2018/05/03 Javascript
详解vuejs2.0 select 动态绑定下拉框支持多选
2019/04/25 Javascript
vue安装遇到的5个报错及解决方法
2019/06/12 Javascript
[59:53]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第二场 3月6日
2021/03/11 DOTA
布同 Python中文问题解决方法(总结了多位前人经验,初学者必看)
2011/03/13 Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
2018/07/18 Python
深入flask之异步非堵塞实现代码示例
2018/07/31 Python
Python二叉搜索树与双向链表转换算法示例
2019/03/02 Python
详解python读取和输出到txt
2019/03/29 Python
Python 占位符的使用方法详解
2019/07/10 Python
pytorch查看torch.Tensor和model是否在CUDA上的实例
2020/01/03 Python
tensorflow 自定义损失函数示例代码
2020/02/05 Python
python实现简单坦克大战
2020/03/27 Python
python实现马丁策略回测3000只股票的实例代码
2021/01/22 Python
迪卡侬波兰体育用品商店:Decathlon波兰
2020/03/31 全球购物
渡河少年教学反思
2014/02/12 职场文书
部门年终奖分配方案
2014/05/07 职场文书
大学生支教感言
2015/08/01 职场文书
浅谈resultMap的用法及关联结果集映射
2021/06/30 Java/Android
C3 线性化算法与 MRO之Python中的多继承
2021/10/05 Python
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
2022/06/21 Python
Go语言编译原理之源码调试
2022/08/05 Golang