首頁 > 軟體

基於Python實現物件導向版學生管理系統

2022-07-20 18:02:59

一、目標

瞭解物件導向開發過程中類內部功能的分析方法

瞭解常用系統功能

◦ 新增

◦ 刪除

◦ 修改

◦ 查詢

二、系統需求

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

系統要求:學生資料儲存在檔案中

系統功能:新增學生、刪除學生、修改學生資訊、查詢學生資訊、顯示所有學生資訊、儲存學生資訊以及退出系統等功能

三、準備程式檔案

1. 分析

角色分析

◦ 學生

◦ 管理系統

工作中注意事項:

為了方便維護程式碼,一般一個角色一個程式檔案

專案要有主程式入口,習慣為 main.py

2. 建立程式檔案

建立專案目錄,例如:StudentManagerSystem

程式檔案如下:

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

四、書寫程式

1. student.py

需求:

學生資訊包含:姓名、性別、手機號

新增 __str__ 魔法方法,方便檢視學生物件資訊

程式程式碼如下

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}'

2. 管理系統需求

儲存資料的位置:檔案(student.data)

◦ 載入檔案資料

◦ 修改資料後儲存到檔案

儲存資料的形式:列表儲存學生物件

系統功能

  • ◦ 新增學生
  • ◦ 刪除學生
  • ◦ 修改學生資訊
  • ◦ 查詢學生資訊
  • ◦ 顯示所有學生資訊
  • ◦ 儲存學生資訊

定義管理系統類:

class StudentManager(object):
    def __init__(self):
        # 儲存資料所用的列表
        self.student_list = []

管理系統框架:

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

步驟:

定義程式入口函數

  • ◦ 載入資料
  • ◦ 顯示功能選單
  • ◦ 使用者輸入功能序號
  • ◦ 根據使用者輸入的功能序號執行不同的功能

定義系統功能函數,新增、刪除學生等

基礎程式程式碼如下

from student import *

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

    # 顯示功能選單
    @staticmethod
    def show_menu():
        print('請選擇如下功能:')
        print('1. 新增學生')
        print('2. 刪除學生')
        print('3. 修改學生資訊')
        print('4. 查詢學生資訊')
        print('5. 顯示所有學生資訊')
        print('6. 儲存學生資訊')
        print('7. 退出系統')

    # 新增學生
    def add_student(self):
        pass

    # 刪除學生
    def del_student(self):
        pass

    # 修改學生資訊
    def modify_student(self):
        pass

    # 查詢學生資訊
    def search_student(self):
        pass

    # 顯示所有學生資訊
    def show_student(self):
        pass

    # 儲存學生資訊
    def save_student(self):
        pass

    # 載入學生資訊
    def load_student(self):
        pass

3. main.py

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

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

    student_manager.run()

4. 定義系統功能函數

4.1 新增學生

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

步驟

  • ◦ 使用者輸入姓名、性別、手機號
  • ◦ 建立該學生物件
  • ◦ 將該學生物件儲存到列表

程式碼

# 新增學生
    def add_student(self):
    	# 使用者輸入姓名、性別、手機號
        name = input('請輸入學生的姓名:')
        gender = input('請輸入學生的性別:')
        tel = input('請輸入學生的手機號:')

		# 建立該學生物件
        student = Student(name, gender, tel)
		
		# 將該學生物件儲存到列表
        self.student_list.append(student)

		# 列印提示資訊
        print(f'學生【{student.name}, {student.gender}, {student.tel}】新增成功!')

4.2 刪除學生

需求:使用者輸入目標學生姓名、性別、手機號,如果學生存在則刪除該學生

步驟:

◦ 使用者輸入目標學生姓名

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

程式碼

# 刪除學生
    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('查無此人!')

4.3 修改學生資訊

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

步驟

◦ 使用者輸入目標學生姓名

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

程式碼

# 修改學生資訊
    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('查無此人!')

4.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('查無此人!')

4.6 顯示所有學生資訊

需求:列印所有學生的資訊

步驟

◦ 遍歷學生資料列表,列印所有學生資訊

程式碼

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

4.7 儲存學生資訊

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

步驟

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

思考:

檔案寫入的資料是學生物件的記憶體地址嗎?

檔案內資料要求的資料型別是什麼?

拓展:__dict__

class A(object):
    a = 0

    def __init__(self):
        self.b = 1


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

程式碼

# 儲存學生資訊
    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' : '女', 'tel' : '123' } ]
        print(new_list)

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

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

4.8 載入學生資訊

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

步驟

嘗試以 “r” 模式開啟學生資料的檔案,如果檔案不存在則以 “w” 模式開啟檔案

如果檔案存在則讀取資料並儲存資料

◦ 讀取資料

◦ 轉換資料型別為列表並轉換列表內的字典為物件

◦ 儲存學生資料到學生列表

關閉檔案

程式碼

# 載入學生資訊
    def load_student(self):
        # 嘗試以 「r」 模式開啟資料檔案,檔案不存在則提示使用者;檔案存在則讀取資料並儲存資料
        try:
            f = open('student.data', 'r')
        except:
            f = open('student.data', 'w')
        else:
            # 讀取資料
            data = f.read()

            # 轉換資料型別為列表並轉換列表內的字典為物件
            new_list = eval(data)

            # 儲存學生資料到學生列表
            self.student_list = [Student(i['name'], i['gender'], i['tel']) for i in new_list]
        finally:
            # 關閉檔案
            f.close()

五、原始碼

main.py

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

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

student.py

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}'

managerSystem.py

from student import *

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:
                # 退出系統 -> 退出迴圈
                print('感謝您的使用,祝您生活愉快!')
                break

    # 顯示功能選單
    @staticmethod
    def show_menu():
        print('請選擇如下功能:')
        print('1. 新增學生')
        print('2. 刪除學生')
        print('3. 修改學生資訊')
        print('4. 查詢學生資訊')
        print('5. 顯示所有學生資訊')
        print('6. 儲存學生資訊')
        print('7. 退出系統')

    # 新增學生
    def add_student(self):
        name = input('請輸入學生的姓名:')
        gender = input('請輸入學生的性別:')
        tel = input('請輸入學生的手機號:')

        student = Student(name, gender, tel)

        self.student_list.append(student)

        print(f'學生【{student.name}, {student.gender}, {student.tel}】新增成功!')

    # 刪除學生
    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('查無此人!')

    # 修改學生資訊
    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('查無此人!')

    # 查詢學生資訊
    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('查無此人!')

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

    # 儲存學生資訊
    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' : '女', 'tel' : '123' } ]
        print(new_list)

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

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

    # 載入學生資訊
    def load_student(self):
        # 嘗試以 「r」 模式開啟資料檔案,檔案不存在則提示使用者;檔案存在則讀取資料並儲存資料
        try:
            f = open('student.data', 'r')
        except:
            f = open('student.data', 'w')
        else:
            # 讀取資料
            data = f.read()

            # 轉換資料型別為列表並轉換列表內的字典為物件
            new_list = eval(data)

            # 儲存學生資料到學生列表
            self.student_list = [Student(i['name'], i['gender'], i['tel']) for i in new_list]
        finally:
            # 關閉檔案
            f.close()

六、總結

知識點

函數

◦ 定義和呼叫

◦ 引數的使用

物件導向

◦ 定義類

◦ 建立物件

◦ 定義和呼叫範例屬性

◦ 定義和呼叫實體方法

資料型別

◦ 列表

增加刪除資料

列表推導式

◦ 字典

◦ 字串

檔案操作

◦ 開啟檔案

◦ 讀取或寫入

◦ 關閉檔案

到此這篇關於基於Python實現物件導向版學生管理系統的文章就介紹到這了,更多相關Python學生管理系統內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com