学校人事管理系统
文章目录
前言
该系统是裘宗燕编写的《数据结构与算法:Python语言描述》中的一个关于类使用的例子,没有使用到数据库。我觉得这个例子非常好,对基于Python的面向对象的理解有帮助,所以对代码做了点微小的改动,在此分享一下。
提示:以下是本篇文章正文内容,下面案例可供参考
一、类设计
我们大致上将学校中的人分为三个类别Person,Student和Staff。
Person是基本人员,Student是学生,Staff是教职员工。
他们都具有姓名,性别,出生年月等属性,而学生有成绩、学号等特殊属性,教职员工有工资、入职时间等特殊属性,所以可以将Person作为一个基类,Student和Staff去继承这个基类。
另外,为了防止存入不符要求的信息,我们可以自定义异常类来处理这个问题。
二、实际代码
1.项目目录
先创建一个python package,叫做学校人事管理系统的类设计。然后在此package下新建py文件,叫做异常类.py。
后面再创建公共人员类.py,学生类.py和教职工类.py。
2.异常类
# 自定义异常类
class PersonTypeError(TypeError):
pass
class PersonValueError(ValueError):
pass
用来处理输入信息的类型不对或数值异常。
3.公共人员类
import datetime
from 异常类 import PersonTypeError, PersonValueError
class Person:
_num = 0
def __init__(self, name, sex, birthday, ident):
"""
实例对象的基础信息
:param name: 姓名
:param sex: 性别
:param birthday: 出生年月
:param ident: 编号
"""
if not (isinstance(name, str) and sex in ('男', '女')):
# 检查姓名是否是字符串,性别是男还是女
raise PersonValueError(name, sex)
try:
birth = datetime.date(*birthday)
except:
raise PersonValueError('wrong date:', birthday)
self._name = name
self._sex = sex
self._birthday = birth
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
def set_name(self, name):
"""
修改名字
:param name: 新名字
:return: void
"""
if not isinstance(name, str):
raise PersonValueError('name:', name)
self._name = name
def __lt__(self, other):
"""
根据编号对人物对象排序
:param other: 对象
:return: 对象的id
"""
if not isinstance(other, Person):
raise PersonTypeError(Person)
return self._id < other._id
@classmethod
def num(cls):
# 类方法,用来获得类中人员的计数值
return Person._num
def __str__(self):
# 提供对象的基本信息
return ' '.join