目標
- 了解面向對象開發過程中類內部功能的分析方法
- 了解常用系統功能
- 添加
- 刪除
- 修改
- 查詢
一. 系統需求
使用面向對象編程思想完成學員管理系統的開發,具體如下:
- 系統要求:學員數據存儲在文件中
- 系統功能:添加學員、刪除學員、修改學員信息、查詢學員信息、顯示所有學員信息、保存學員信息及退出系統等功能。
二. 准備程序文件
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 定義類
class StudentManager(object):
def __init__(self):
# 存儲數據所用的列表
self.student_list = []
3.2.2 管理系統框架
需求:系統功能循環使用,用戶輸入不同的功能序號執行不同的功能。
- 步驟
- 定義程序入口函數
- 加載數據
- 顯示功能菜單
- 用戶輸入功能序號
- 根據用戶輸入的功能序號執行不同的功能
- 定義系統功能函數,添加、刪除學員等
- 定義程序入口函數
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()
四. 總結
- 函數
- 定義和調用
- 參數的使用
- 面向對象
- 定義類
- 創建對象
- 定義和調用實例屬性
- 定義和調用實例方法
- 數據類型
- 列表
- 增加刪除數據
- 列表推導式
- 字典
- 字符串
- 列表
- 文件操作
- 打開文件
- 讀取或寫入
- 關閉文件