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 实现购物商城,含有用户入口和商家入口的示例
Sep 15 Python
python删除服务器文件代码示例
Feb 09 Python
python pandas中DataFrame类型数据操作函数的方法
Apr 08 Python
python Web开发你要理解的WSGI &amp; uwsgi详解
Aug 01 Python
python文件拆分与重组实例
Dec 10 Python
flask框架自定义过滤器示例【markdown文件读取和展示功能】
Nov 08 Python
python3 实现调用串口功能
Dec 26 Python
python对Excel的读取的示例代码
Feb 14 Python
python在linux环境下安装skimage的示例代码
Oct 14 Python
基于python爬取链家二手房信息代码示例
Oct 21 Python
python设置 matplotlib 正确显示中文的四种方式
May 10 Python
python通过opencv调用摄像头操作实例分析
Jun 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
PHP字符串处理的10个简单方法
2010/06/30 PHP
php中判断字符串是否全是中文或含有中文的实现代码
2011/09/16 PHP
php实现复制移动文件的方法
2015/07/29 PHP
php简单判断文本编码的方法
2015/07/30 PHP
PHP去除字符串最后一个字符的三种方法实例
2017/03/01 PHP
Laravel配置全局公共函数的方法步骤
2019/05/09 PHP
js 操作select相关方法函数
2009/12/06 Javascript
讨论javascript(一)工厂方式 js面象对象的定义方法
2009/12/15 Javascript
javascript中AJAX用法实例分析
2015/01/30 Javascript
jQuery调用ajax请求的常见方法汇总
2015/03/24 Javascript
nodejs通过phantomjs实现下载网页
2015/05/04 NodeJs
jquery实现全屏滚动
2015/12/28 Javascript
谈谈因Vue.js引发关于getter和setter的思考
2016/12/02 Javascript
JavaScript中清空数组的方法总结
2016/12/02 Javascript
js实现显示手机号码效果
2017/03/09 Javascript
详解webpack+gulp实现自动构建部署
2017/06/29 Javascript
Vue.js图片预览插件使用详解
2018/08/27 Javascript
微信小程序实现日历效果
2018/12/28 Javascript
记一次vue-webpack项目优化实践详解
2019/02/17 Javascript
JavaScript的console命令使用实例
2019/12/03 Javascript
webpack 动态批量加载文件的实现方法
2020/03/19 Javascript
Element Alert警告的具体使用方法
2020/07/27 Javascript
Python创建模块及模块导入的方法
2015/05/27 Python
python3.4用循环往mysql5.7中写数据并输出的实现方法
2017/06/20 Python
python程序 创建多线程过程详解
2019/09/23 Python
python多进程间通信代码实例
2019/09/30 Python
Python模块汇总(常用第三方库)
2019/10/07 Python
Python序列对象与String类型内置方法详解
2019/10/22 Python
Python不支持 i ++ 语法的原因解析
2020/07/22 Python
英国电动工具购买网站:Anglia Tool Centre
2017/04/25 全球购物
Java的接口和C++的虚类的相同和不同处
2014/03/27 面试题
二年级体育教学反思
2014/01/15 职场文书
医德医魂心得体会
2014/09/11 职场文书
拆迁委托协议书
2014/09/15 职场文书
2014年法制宣传日活动方案
2014/11/02 职场文书
董事长助理工作总结2015
2015/07/23 职场文书