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实现的RSS阅读器实例
Jul 25 Python
Python生成随机验证码的两种方法
Dec 22 Python
深入理解python中的浅拷贝和深拷贝
May 30 Python
python引入导入自定义模块和外部文件的实例
Jul 24 Python
python web.py开发httpserver解决跨域问题实例解析
Feb 12 Python
用python与文件进行交互的方法
Mar 01 Python
selenium3+python3环境搭建教程图解
Dec 07 Python
Python3之不使用第三方变量,实现交换两个变量的值
Jun 26 Python
python 实现字符串下标的输出功能
Feb 13 Python
如何使用python切换hosts文件
Apr 29 Python
python pillow库的基础使用教程
Jan 13 Python
Python爬虫入门教程01之爬取豆瓣Top电影
Jan 24 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生成静态页面分析 模板+缓存+写文件
2009/08/17 PHP
php json_encode奇怪问题说明
2011/09/27 PHP
phpword插件导出word文件时中文乱码问题处理方案
2014/08/19 PHP
PHP间隔一段时间执行代码的方法
2014/12/02 PHP
解决form中action属性后面?传递参数 获取不到的问题
2017/07/21 PHP
PHP基于Closure类创建匿名函数的方法详解
2017/08/17 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
2017/12/21 PHP
js函数般调用正则
2008/04/08 Javascript
Javascript Jquery 遍历Json的实现代码
2010/03/31 Javascript
让人期待的2011年度最佳 jQuery 插件分享
2012/03/16 Javascript
jQuery实现多按钮单击变色
2014/11/27 Javascript
同一个网页中实现多个JavaScript特效的方法
2015/02/02 Javascript
JS实现自动变换的菜单效果代码
2015/09/09 Javascript
js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解
2016/04/01 Javascript
浅谈JavaScript对象的创建方式
2016/06/13 Javascript
基于CSS3和jQuery实现跟随鼠标方位的Hover特效
2016/07/25 Javascript
Js获取当前日期时间及格式化代码
2016/09/17 Javascript
vue单页应用在页面刷新时保留状态数据的方法
2018/09/21 Javascript
JavaScript判断对象和数组的两种方法
2019/05/31 Javascript
微信小程序组件生命周期的踩坑记录
2021/03/03 Javascript
django自定义Field实现一个字段存储以逗号分隔的字符串
2014/04/27 Python
Python脚本获取操作系统版本信息
2016/12/17 Python
获取Django项目的全部url方法详解
2017/10/26 Python
python 类对象和实例对象动态添加方法(分享)
2017/12/31 Python
python 实现对文件夹中的图像连续重命名方法
2018/10/25 Python
Python numpy.array()生成相同元素数组的示例
2018/11/12 Python
python中Django文件上传方法详解
2020/08/05 Python
浅析Python模块之间的相互引用问题
2021/02/26 Python
CSS3 分类菜单效果
2019/05/27 HTML / CSS
HTML5开发动态音频图的实现
2020/07/02 HTML / CSS
amazeui页面校验功能的实现代码
2020/08/24 HTML / CSS
怎样在程序里获得一个空指针
2015/01/24 面试题
大学生自荐材料范文
2014/12/30 职场文书
小学六一儿童节活动总结
2015/05/05 职场文书
幼儿园小班教育随笔
2015/08/14 职场文书
深入理解python多线程编程
2021/04/18 Python