【Python】面向物件版學員管理系統
阿新 • • 發佈:2020-09-19
面向物件版學員管理系統
一. 系統需求
使用面向物件程式設計思想完成學員管理系統的開發,具體如下:
- 系統要求:學員資料儲存在檔案中
- 系統功能:新增學員、刪除學員、修改學員資訊、查詢學員資訊、顯示所有學員資訊、儲存學員資訊及退出系統等功能。
二. 準備程式檔案
2.1 分析
- ⻆色分析
- 學員
- 管理系統
工作中注意事項
- 為了方便維護程式碼,一般一個⻆色一個程式檔案;
- 專案要有主程式入口,習慣為 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 儲存學員資訊
需求:將修改後的學員資料儲存到儲存資料的檔案。
步驟
- 開啟檔案
- 檔案寫入資料
- 關閉檔案
思考
- 檔案寫入的資料是學員物件的記憶體地址嗎?
- 檔案內資料要求的資料型別是什麼?
拓展 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()