美文网首页
day17-永久存储的人力系统(代码未优化)

day17-永久存储的人力系统(代码未优化)

作者: RurouniKenshin | 来源:发表于2018-08-01 20:43 被阅读231次

一种思路(同步执行)

"""new python"""
import json


class Employee:
    """员工类"""
    def __init__(self, name='', age=0, sex='m', staff_id='20180000', salary=0, position='', department=''):
        self.name = name
        self.age = age
        self.staff_id = staff_id
        self.salary = salary
        self.position = position
        self.department = department
        self.sex = sex


class Management:
    """员工管理器"""
    __employee_number = './file/number.json' # 私有属性员工数量存储文件路径
    __employee = './file/employee.json' # 私有属性员工信息存储文件路径

    def __init__(self): # 初始化管理器,实际上可以不用初始化管理器,写成类方法就行了,主要是后面有很多对象方法,懒得把self改成cls,就将就了
        employees_copy = [] # 初始化员工列表
        list_employee = self.json_read(self.__employee) # 读取文件中的员工信息
        for x in list_employee: # 遍历员工
            employee = self.create_employee(x) # 将员工字典数据类型转化为对象
            employees_copy.append(employee) # 为员工列表加载员工对象
        self.employees = employees_copy[:] # 为对象设置属性员工
        self.name = '人力资源管理器1.0' # 为对象设置属性管理器名字,无用的属性

    @classmethod
    def __create_id(cls): # 自动生成员工号
        number = cls.json_read(cls.__employee_number) # 读取文件中的员工数
        number += 1 # 没生成一次id 员工数+1
        cls.json_write(cls.__employee_number, number) # 将改变的员工数重新写入文件
        return '2018' + str(number).rjust(4, '0') # 返回员工号

    def add_employee(self): # 添加新员工,修改数据的操作要进行对象列表与文本数据列表的同步
        print('the place of adding employee:')
        name = input('new employee\'s name:')
        age = int(input('new employee\'s age:'))
        sex = input('new employee\'s sex:')
        salary = int(input('new employee\'s salary:'))
        position = input('new employee\'s position:')
        department = input('new employee\'s department:') # 以上为输入信息
        employee = Employee(name, age, sex, Management.__create_id(), salary, position, department) # 创建新的对象
        employee_dict = employee.__dict__ # 将对象转化为字典类型数据
        list_employee = self.json_read(self.__employee) # 读取文件信息
        list_employee.append(employee_dict) # 将新添加的员工信息以字典的形式加入文件列表中
        self.employees.append(employee) # 将新添加的员工信息以对象的形式加入类的对象列表中
        self.json_write(self.__employee, list_employee) # 新员工字典数据写入文件
        print('添加成功')

        """整个的添加学生的操作实际上进行了2个方向的添加,1.因为初始化读取了文件并将其中的字典类型数据转化为对象放在了对象数组里,
        之后添加学生到文件需要读取文件并且获取添加学生的字典类型数据在写入。也就是说对象数组的操作与文件字典数组的操作同步进行,但
        是互不干扰,那么在结束整个添加过程后,文件列表和当前程序里的对象列表保持一致,这样就可以把对象列表看成已经存储成功的文件列
        表来使用。同时这样做对于下面的所有只是读取数据的方法来说,就不需要再去打开文件,而可以直接使用当前对象的对象列表进行读取操
        作,好处在于减少了文件的频繁读取,方便非数据修改操作的快速执行,弊端也很明显,因为是没有通过读取文件来实现查看,会因为高频
        率的修改操作导致对象列表越来越大,程序运行受到很大影响。当然,我们这个小程序没到那么大数据,就算大数据也要用nosql数据库进
        行处理了"""

    def del_employee(self): # 删除员工,修改数据的操作要进行对象列表与文本数据列表的同步
        list_employee = self.json_read(self.__employee) # 读取文件信息,获得列表
        print('the place of deleting employee:')
        staff_id = input('input the deleted employee\'s staff_id:')
        for employee in self.employees[:]:
            if employee.staff_id == staff_id:
                self.employees.remove(employee) # 对象列表的删除
                list_employee.remove(employee.__dict__) # 文件列表的删除
                self.json_write(self.__employee, list_employee) # 删除后的文件列表的写入
                break
        print('删除成功')

        """下面的全是读取的操作,就可以直接使用对象列表"""

    def info_employee(self):
        print('the place of looking up a employee:')
        name = input('input the looking employee\'s name:')
        for employee in self.employees:
            if employee.name == name:
                print('name:%s age:%d sex:%s staff_id:%s salary:%d position:%s department:%s' %
                      (employee.name, employee.age, employee.sex,
                       employee.staff_id, employee.salary,
                       employee.position, employee.department))

    def max_salary_employee(self):
        print('the employee of having max salary:')
        max_employee = Employee('', 0, '', '', 0, '', '')
        for employee in self.employees:
            if max_employee.salary <= employee.salary:
                max_employee = employee
        print('name:%s age:%d sex:%s staff_id:%s salary:%d position:%s department:%s' %
              (max_employee.name, max_employee.age, max_employee.sex,
               max_employee.staff_id, max_employee.salary,
               max_employee.position, max_employee.department))

    def avg_department_salary(self):
        print('the avg_salary of a department:')
        department = input('the department\'s name:')
        sum1 = 0
        count = 0
        for employee in self.employees:
            if employee.department == department:
                sum1 += employee.salary
                count += 1
        try:
            print(sum1/count)
        except ZeroDivisionError:
            print('there is no employee')

    def avg_age_allemployee(self):
        print('the avg_age of the company:')
        sum1 = 0
        for employee in self.employees:
            sum1 += employee.age
        print(sum1/len(self.employees))

    def all_employee_info(self):
        print('all information of employees:')
        for employee in self.employees:
            print('name:%s age:%d sex:%s staff_id:%s salary:%d position:%s department:%s' %
                  (employee.name, employee.age, employee.sex,
                   employee.staff_id, employee.salary,
                   employee.position, employee.department))
    # 静态方法,读取文件
    @staticmethod
    def json_read(file):
        with open(file, 'r', encoding='utf-8') as jf:
            context = json.load(jf)
        return context
    # 静态方法,写入文件
    @staticmethod
    def json_write(file, information):
        with open(file, 'w', encoding='utf-8') as jf:
            json.dump(information, jf)
    # 静态方法,字典到对象的转化(对象到字典的转化使用 对象名.__dict__)
    @staticmethod
    def create_employee(dict1):
        employee = Employee()
        for i in dict1:
            employee.__setattr__(i, dict1[i])
        return employee


if __name__ == '__main__':
    # 测试代码
    management = Management()
    while True:
        management.add_employee()
        order = input('contiue? y/n >>>>')
        if order == 'n':
            break
    management.all_employee_info()
    management.del_employee()
    management.info_employee()
    management.all_employee_info()
    management.max_salary_employee()
    management.avg_department_salary()
    management.avg_age_allemployee()

相关文章

网友评论

      本文标题:day17-永久存储的人力系统(代码未优化)

      本文链接:https://www.haomeiwen.com/subject/hvzrvftx.html