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 3.7新功能之dataclass装饰器详解
Apr 21 Python
django利用request id便于定位及给日志加上request_id
Aug 26 Python
python 多线程对post请求服务器测试并发的方法
Jun 13 Python
python中比较两个列表的实例方法
Jul 04 Python
Python适配器模式代码实现解析
Aug 02 Python
python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)
Aug 06 Python
python 直接赋值和copy的区别详解
Aug 07 Python
Python-Flask:动态创建表的示例详解
Nov 22 Python
python add_argument()用法解析
Jan 29 Python
在python中求分布函数相关的包实例
Apr 15 Python
Python Django搭建网站流程图解
Jun 13 Python
Flask response响应的具体使用
Jul 15 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+javascript液晶时钟
2006/10/09 PHP
使用XDebug调试及单元测试覆盖率分析
2011/01/27 PHP
php导入大量数据到mysql性能优化技巧
2014/12/29 PHP
PHP堆栈调试操作简单示例
2018/06/15 PHP
PHP ajax+jQuery 实现批量删除功能实例代码小结
2018/12/06 PHP
js innerHTML 改变div内容的方法
2013/08/03 Javascript
一个JavaScript变量声明的知识点
2013/10/28 Javascript
JS截取字符串常用方法详细整理
2013/10/28 Javascript
Node.js中使用事件发射器模式实现事件绑定详解
2014/08/15 Javascript
用canvas 实现个图片三角化(LOW POLY)效果
2016/02/18 Javascript
微信小程序 用户数据解密详细介绍
2017/01/09 Javascript
微信JS-SDK选取手机照片上传功能
2017/04/21 Javascript
Angular2搜索和重置按钮过场动画
2017/05/24 Javascript
node.js中使用Export和Import的方法
2017/09/18 Javascript
微信小程序媒体组件详解(视频,音乐,图片)
2017/09/19 Javascript
vue router仿天猫底部导航栏功能
2017/10/18 Javascript
如何为vue的项目添加单元测试
2018/12/19 Javascript
详解小程序云开发数据库
2019/05/20 Javascript
node.js中 redis 的安装和基本操作示例
2020/02/10 Javascript
KMP算法精解及其Python版的代码示例
2016/06/01 Python
使用pandas批量处理矢量化字符串的实例讲解
2018/07/10 Python
python3 打开外部程序及关闭的示例
2018/11/06 Python
详解查看Python解释器路径的两种方式
2020/10/15 Python
英国大码女性时装零售商:Evans
2018/08/29 全球购物
Clarks鞋澳大利亚官方网站:Clarks Australia
2019/12/25 全球购物
客服专员岗位职责范本
2013/11/29 职场文书
大学生创业计划书的格式要求
2013/12/29 职场文书
装修致歉信
2014/01/15 职场文书
计算机毕业生求职信
2014/06/10 职场文书
机电系毕业生求职信
2014/07/11 职场文书
党课培训心得体会
2014/09/02 职场文书
授权委托书样本及填写说明
2014/09/19 职场文书
自愿离婚协议书范文2014
2014/10/12 职场文书
学习十八届四中全会精神思想汇报
2014/10/23 职场文书
听证会主持词
2015/07/03 职场文书
linux下导入、导出mysql数据库命令的实现方法
2021/05/26 MySQL