1. 程式人生 > 實用技巧 >【Python】面向物件版學員管理系統

【Python】面向物件版學員管理系統

面向物件版學員管理系統

一. 系統需求

使用面向物件程式設計思想完成學員管理系統的開發,具體如下:

  • 系統要求:學員資料儲存在檔案中
  • 系統功能:新增學員、刪除學員、修改學員資訊、查詢學員資訊、顯示所有學員資訊、儲存學員資訊及退出系統等功能。

二. 準備程式檔案

2.1 分析

  • ⻆色分析
    • 學員
    • 管理系統

工作中注意事項

  1. 為了方便維護程式碼,一般一個⻆色一個程式檔案;
  2. 專案要有主程式入口,習慣為 main.py

2.2 建立程式檔案

建立專案目錄,例如: StudentManagerSystem
程式檔案如下:

  • 程式入口檔案:main.py
  • 學員檔案:student.py
  • 管理系統檔案:managerSystem.py

三. 書寫程式

3.1 student.py

需求:

  • 學員資訊包含:姓名、性別、手機號;
  • 新增 str 魔法方法,方便檢視學員物件資訊

3.1.2 程式程式碼

class Student(object):
    def __init__(self, name, gender, tel):
        self.name = name
        self.gender = gender
        self.tel = tel
 
    def __str__(self):
        return f'{self.name}, {self.gender}, {self.tel}'

3.2 managerSystem.py

需求:

  • 儲存資料的位置:檔案(student.data)
    • 載入檔案資料
    • 修改資料後儲存到檔案
  • 儲存資料的形式:列表儲存學員物件
  • 系統功能
    • 新增學員
    • 刪除學員
    • 修改學員
    • 查詢學員資訊
    • 顯示所有學員資訊
    • 儲存學員資訊
    • 退出系統

3.2.1 定義類

3.2.2 管理系統框架

需求:系統功能迴圈使用,使用者輸入不同的功能序號執行不同的功能。

  • 步驟
    • 定義程式入口函式
      • 載入資料
      • 顯示功能選單
      • 使用者輸入功能序號
      • 根據使用者輸入的功能序號執行不同的功能
  • 定義系統功能函式,新增、刪除學員等
class StudentManager(object):
 def __init__(self):
 # 儲存資料所用的列表
 self.student_list = []
1234
class StudentManager(object):
 def __init__(self):
 # 儲存資料所用的列表
 self.student_list = []
 # 一. 程式入口函式,啟動程式後執行的函式
 def run(self):
 # 1. 載入學員資訊
 self.load_student()
 while True:
 # 2. 顯示功能選單
 self.show_menu()
 # 3. 使用者輸入功能序號
 menu_num = int(input('請輸入您需要的功能序號:'))
 # 4 根據使用者輸入的功能序號執行不同的功能
 if menu_num == 1:
 # 新增學員
 self.add_student()
 elif menu_num == 2:
 # 刪除學員
 self.del_student()
 elif menu_num == 3:
 # 修改學員資訊
 self.modify_student()
 elif menu_num == 4:
 # 查詢學員資訊
 self.search_student()
 elif menu_num == 5:
 # 顯示所有學員資訊
 self.show_student()
 elif menu_num == 6:
 # 儲存學員資訊
 self.save_student()
 elif menu_num == 7:
 # 退出系統
 break
 # 二. 定義功能函式
 # 2.1 顯示功能選單
 @staticmethod
 def show_menu():
 print('請選擇如下功能-----------------')
 print('1:新增學員')
 print('2:刪除學員')
 print('3:修改學員資訊')
 print('4:查詢學員資訊')
 print('5:顯示所有學員資訊')
 print('6:儲存學員資訊')
 print('7:退出系統')
 # 2.2 新增學員
 def add_student(self):
 pass
 # 2.3 刪除學員
 def del_student(self):
 pass
 # 2.4 修改學員資訊
 def modify_student(self):
 pass
 # 2.5 查詢學員資訊
 def search_student(self):
 pass
 # 2.6 顯示所有學員資訊
 def show_student(self):
 pass
 # 2.7 儲存學員資訊
 def save_student(self):
 pass
 # 2.8 載入學員資訊
 def load_student(self):
 pass

3.3 main.py

# 1. 匯入managerSystem模組
from managerSystem import *

# 2. 啟動學員管理系統
if __name__ == '__main__':
    student_manager = StudentManager()
    student_manager.run()

3.4 定義系統功能函式

3.4.1 新增功能

需求:使用者輸入學員姓名、性別、手機號,將學員新增到系統。

步驟

  • 使用者輸入姓名、性別、手機號
  • 建立該學員物件
  • 將該學員物件新增到列表

程式碼

# 新增學員函式內部需要建立學員物件,故先匯入student模組
from student import *
class StudentManager(object):
    ......
 
    # 2.2 新增學員
    def add_student(self):
        # 1. 使用者輸入姓名、性別、手機號
        name = input('請輸入您的姓名:')
        gender = input('請輸入您的性別:')
        tel = input('請輸入您的手機號:')

        # 2. 建立學員物件:先匯入學員模組,再建立物件
        student = Student(name, gender, tel)

        # 3. 將該學員物件新增到列表
        self.student_list.append(student)
    
        # 列印資訊
        print(self.student_list)
        print(student)

3.4.2 刪除學員

需求:使用者輸入目標學員姓名,如果學員存在則刪除該學員。

步驟

  • 使用者輸入目標學員姓名
  • 遍歷學員資料列表,如果使用者輸入的學員姓名存在則刪除,否則則提示該學員不存在。

程式碼

    # 2.3 刪除學員:刪除指定姓名的學員
    def del_student(self):
        # 1. 使用者輸入目標學員姓名
        del_name = input('請輸入要刪除的學員姓名:')
 
        # 2. 如果使用者輸入的目標學員存在則刪除,否則提示學員不存在
        for i in self.student_list:
            if i.name == del_name:
                self.student_list.remove(i)
                    break
        else:
            print('查無此人!')
 
        # 列印學員列表,驗證刪除功能
        print(self.student_list)

3.4.3 修改學員資訊

需求:使用者輸入目標學員姓名,如果學員存在則修改該學員資訊。

步驟

  • 使用者輸入目標學員姓名;
  • 遍歷學員資料列表,如果使用者輸入的學員姓名存在則修改學員的姓名、性別、手機號資料,否則則提示該學員不存在。

程式碼

    # 2.4 修改學員資訊
    def modify_student(self):
        # 1. 使用者輸入目標學員姓名
        modify_name = input('請輸入要修改的學員的姓名:')
        # 2. 如果使用者輸入的目標學員存在則修改姓名、性別、手機號等資料,否則提示學員不存在
        for i in self.student_list:
            if i.name == modify_name:
                i.name = input('請輸入學員姓名:')
                i.gender = input('請輸入學員性別:')
                i.tel = input('請輸入學員手機號:')
                print(f'修改該學員資訊成功,姓名{i.name},性別{i.gender}, 手機號{i.tel}')
                break
        else:
            print('查無此人!')

3.4.5 查詢學員資訊

需求:使用者輸入目標學員姓名,如果學員存在則列印該學員資訊

步驟

  • 使用者輸入目標學員姓名
  • 遍歷學員資料列表,如果使用者輸入的學員姓名存在則列印學員資訊,否則提示該學員不存在。

程式碼

    # 2.5 查詢學員資訊
    def search_student(self):
        # 1. 使用者輸入目標學員姓名
        search_name = input('請輸入要查詢的學員的姓名:')
    
    # 2. 如果使用者輸入的目標學員存在,則列印學員資訊,否則提示學員不存在
    for i in self.student_list:
        if i.name == search_name:
            print(f'姓名{i.name},性別{i.gender}, 手機號{i.tel}')
            break
    else:
        print('查無此人!')

3.4.6 顯示所有學員資訊

列印所有學員資訊

步驟

  • 遍歷學員資料列表,列印所有學員資訊

程式碼

    # 2.6 顯示所有學員資訊
    def show_student(self):
        print('姓名\t性別\t手機號')
        for i in self.student_list:
            print(f'{i.name}\t{i.gender}\t{i.tel}')

3.4.7 儲存學員資訊

需求:將修改後的學員資料儲存到儲存資料的檔案。

步驟

  • 開啟檔案
  • 檔案寫入資料
  • 關閉檔案

思考

  1. 檔案寫入的資料是學員物件的記憶體地址嗎?
  2. 檔案內資料要求的資料型別是什麼?

拓展 dict

class A(object):
    a = 0

    def __init__(self):
    self.b = 1

aa = A()
# 返回類內部所有屬性和方法對應的字典
print(A.__dict__)
# 返回例項屬性和值組成的字典
print(aa.__dict__)

在Python中
程式碼

    # 2.7 儲存學員資訊
    def save_student(self):
        # 1. 開啟檔案
        f = open('student.data', 'w')

        # 2. 檔案寫入學員資料
        # 注意1:檔案寫入的資料不能是學員物件的記憶體地址,需要把學員資料轉換成列表字典資料再做儲存
        new_list = [i.__dict__ for i in self.student_list]
        # [{'name': 'aa', 'gender': 'nv', 'tel': '111'}]
        print(new_list)

        # 注意2:檔案內資料要求為字串型別,故需要先轉換資料型別為字串才能檔案寫入資料
        f.write(str(new_list))

        # 3. 關閉檔案
        f.close()

3.4.8 載入學員資訊

需求:每次進入系統後,修改的資料是檔案裡面的資料

步驟

  • 嘗試以 "r" 模式開啟學員資料檔案,如果檔案不存在則以 "w" 模式開啟檔案
  • 如果檔案存在則讀取資料並存儲資料
    • 讀取資料
    • 轉換資料型別為列表並轉換列表內的字典為物件
    • 儲存學員資料到學員列表
  • 關閉檔案

程式碼

    # 2.8 載入學員資訊
    def load_student(self):
        # 嘗試以"r"模式開啟資料檔案,檔案不存在則提示使用者;檔案存在(沒有異常)則讀取資料
        try:
            f = open('student.data', 'r')
        except:
            f = open('student.data', 'w')
        else:
            # 1. 讀取資料
            data = f.read()

            # 2. 檔案中讀取的資料都是字串且字串內部為字典資料,故需要轉換資料型別再轉換字典為物件後儲存到學員列表
            new_list = eval(data)
            self.student_list = [Student(i['name'], i['gender'], i['tel']) for i in new_list]
        finally:
            # 3. 關閉檔案
            f.close()