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

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

import datetimeclass PersonValueError(ValueError):pass
class 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 = nameself._sex = sexself._birthday = birthdayself._id = identPerson._num += 1def id(self):return self._iddef name(self):return self._namedef sex(self):return self._sexdef birthday(self):return self._birthdaydef 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# 用于之后的排序使用@classmethoddef num(cls):return Person._numdef __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 += 1year = datetime.date.today().yearreturn "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 = departmentself._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@classmethoddef _id_gen(cls, birthday):cls._id_num += 1birth_year = datetime.date(*birthday).yearreturn "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 = 1720self._department = "未定"self._position = "未定"def set_salary(self, amount):if not type(amount) is int:raise TypeErrorself._salary = amountdef set_position(self, position):self._position = positiondef set_department(self, department):self._department = departmentdef 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实现一个大学的人员管理系统相关推荐

  1. 大学教务人员管理系统(C++实现)

    实验目的 理解继承与派生的概念及其在面向对象程序设计中的作用. 掌握通过继承派生出一个新类的方法. 掌握运算符重载的基本方法. 实验原理 一个派生类可以同时有多个基类,称为多继承,一个派生类只有一个直 ...

  2. 学习记录:python实现一个简易的校园管理系统7.19

    实现一个简易的校园管理系统,使用容器保存学生数据和老师数据. 学员信息有: 姓名, 年龄, 性别,班级,学号 讲师信息有:姓名, 年龄, 性别, 课程, 工号 (可以使用列表嵌套字典的方式保存学生和讲 ...

  3. 如何用Python做一个简易学生信息管理系统

    一.系统简介 实现一个学生信息的管理系统:主要功能有: 添加学生信息 删除学生信息 修改学生信息 查询学生信息 显示学生信息 退出当前系统 二.步骤分析 显示功能界面 用户输入功能序号 对不同序号的功 ...

  4. python开发系统-python3+django2开发一个简单的人员管理系统

    一.基础环境准备 windows环境: Pycharm python3.6 Django2.0.1 Mysql5.7 安装django 在pycharm terminal 控制台执行: python3 ...

  5. 小程序一:利用Python编写一个简单的图书管理系统

    完成项目的流程: 想要完成某个项目基本都是按这个流程进行编写 想要实现的功能 代码的实现 class Book:def __init__(self,name,author,recommendation ...

  6. Python做一个简单的名片管理系统

    项目介绍 如下图,本次项目主要完成新建名片.显示全部名片.查询对应名片并对对应名片完成相关操作. 框架搭建: 名片管理首先可以由main.py以及tools.py组成,main.py主要完成主要功能, ...

  7. 用python编写学生管理系统_用python写一个简单的学生管理系统

    要求如下:1.一个循环2中输入内容的能力.显示函数添加新名片显示所有查询的名片3退出系统.让用户输入所需的操作,如输入1,2,3,04.新列表提示用户输入名称和输入电子邮件提示成功添加新名片.5.显示 ...

  8. 我用python写了一个简单的企业管理系统

    课设必看!用python实现一个简单的企业管理系统,实现对公司信息的修改,部门的管理,员工的管理! 1.设计思路 没有利用面向对象的编程方法,仅仅关注业务实现 获取键盘输入的信息确定用户进行的操作,代 ...

  9. spring boot大学体育赛事管理系统 毕业设计-附源码180923

    Springboot大学体育赛事管理系统 摘 要 21世纪时信息化的时代,几乎任何一个行业都离不开计算机,将计算机运用于学校的大学体育竞赛管理也是十分常见的.过去使用手工的管理方式对大学体育赛事进行管 ...

最新文章

  1. Maven学习总结(九)——使用Nexus搭建Maven私服
  2. memcached简介(转)
  3. iOS架构-cocoaPods之自制私有库及管理(17)
  4. linux-----shell高级编程----sed应用
  5. Go语言 读写锁互斥锁原理剖析(1)
  6. php 用积分兑换_PHP积分兑换接口demo
  7. 简单十步让你全面理解SQL
  8. python利用字典实现大侠_python实现字符串和字典的转换
  9. mysql时区代码_mysql时区设置为东八区
  10. Spark2.2出现异常:ERROR SparkUI: Failed to bind SparkUI
  11. 显示隐藏-display(HTML、CSS)
  12. ICLR'17 | 在特征空间增强数据集
  13. mac jenkins下载与安装
  14. 网络安全等级保护制度介绍
  15. OpenWrt自定义luci页面来修改配置文件
  16. 面试被问自己的“优点和缺点”如何机智应答
  17. vue+barcode实现扫一扫功能
  18. Spring Cloud与Dubbo怎么选择?
  19. 【计算机网络】常见面试题总结
  20. 怎么把ogg音乐格式转换成mp3

热门文章

  1. 【转】GC、 Wii汉化技术漫谈(上,中) by HyperIris
  2. OPC Expert v8.1.2211 Crack
  3. Ghost XP SP3 电脑城 2011 元旦装机版v18.2
  4. 前端小作业~精灵图拼名字
  5. 从输入URL到页面加载完成都发生了什么
  6. 国产触控笔哪个牌子好?第三方电容笔推荐
  7. 新劳动法关于员工罚款的规定有哪些
  8. MATLAB软件入门分析(附卡尔曼滤波的例程、mlx文件)
  9. 如何接入网线水晶头方法及步骤
  10. 【正点原子MP157连载】第二十二章 新字符设备驱动实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7