学校人事管理系统python实现

类定义实例:学校人事管理系统

为一个学校的人员管理系统定义所需要的表示人员信息的类,它们都是数据抽象(ADT)

问题分析和设计

学校首先有两大类员工,学生与教职工,他们都是需要在系统里面表示的对象。分析这两类人员需要记录的信息,我们可以发现其具有的很多异同点:

  • 姓名,性别、年龄,学号,教职工号
  • 学生又有院系、注册时间,所修课程
  • 教职工有入职时间、院系、职位和工资等信息

由于这两类人员的信息既有共性又有特殊性,特别适合采用面向对象的类继承机制处理
在这里插入图片描述

基本人员Person的ADT的设计:

在这里插入图片描述

学生类ADT的设计:

在这里插入图片描述

教职工 ADT的设计:

在这里插入图片描述

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)))


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())))


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())
print(p1.age())

代码参考《数据结构与算法 python语言描述》

  • 8
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的Python学校人事管理系统代码实现了添加、删除、查询、修改等功能: ```python # 学校人事管理系统 staff_list = [] # 员工列表,用于存储员工信息 # 添加员工 def add_staff(): staff = {} # 员工信息字典 staff['id'] = input('请输入员工编号:') staff['name'] = input('请输入员工姓名:') staff['job'] = input('请输入员工职位:') staff['salary'] = input('请输入员工薪资:') staff_list.append(staff) print('添加成功!') # 删除员工 def del_staff(): id = input('请输入要删除的员工编号:') for staff in staff_list: if staff['id'] == id: staff_list.remove(staff) print('删除成功!') break else: print('员工不存在!') # 查询员工 def query_staff(): id = input('请输入要查询的员工编号:') for staff in staff_list: if staff['id'] == id: print('员工编号:', staff['id']) print('员工姓名:', staff['name']) print('员工职位:', staff['job']) print('员工薪资:', staff['salary']) break else: print('员工不存在!') # 修改员工 def modify_staff(): id = input('请输入要修改的员工编号:') for staff in staff_list: if staff['id'] == id: staff['name'] = input('请输入员工姓名:') staff['job'] = input('请输入员工职位:') staff['salary'] = input('请输入员工薪资:') print('修改成功!') break else: print('员工不存在!') # 主函数 def main(): while True: print('欢迎使用学校人事管理系统:') print('1. 添加员工') print('2. 删除员工') print('3. 查询员工') print('4. 修改员工') print('0. 退出系统') choice = input('请选择:') if choice == '1': add_staff() elif choice == '2': del_staff() elif choice == '3': query_staff() elif choice == '4': modify_staff() elif choice == '0': print('再见!') break else: print('输入错误,请重新选择!') if __name__ == '__main__': main() ``` 这个系统比较简单,只是用了一个列表来存储员工信息,更完整的系统需要使用数据库等技术来实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值