目录
11.7.3、student_manager_system.py
00、复习和反馈
实例属性:
类外部:实例对象.属性名 = 属性值
类内部:self.属性 = 属性值(一般在__init__()中操作)
类属性:
类内部,方法外部直接定义的变量,就是类属性
实例方法:
直接定义的方法
def 方法名(self):
# 方法使用了实例属性
self.属性
pass
类方法:
@classmethod
def 方法名(cls):
类名.类属性
cls.类属性
pass
静态方法:
@staticmethod
def 方法名():
pass
01、异常的概念[了解]
# 异常: 程序运行过程中,代码遇到错误,给出错误的提示
print('其他的代码...')
num = input('请输入一个数字:')
# ZeroDivisionError: division by zero
# ValueError: invalid literal for int() with base 10: 'a'
num = 10 / int(num)
print('计算得到的结果是:', num)
print('其他的代码...')
02、捕获单个异常[掌握]
# 异常: 程序代码在运行过程中遇到的错误, 程序会报错、会终止程序代码的运行.
# 异常捕获: 是指在程序代码运行过程中,遇到错误,不让程序代码终止,让其继续运行,同时可以给使用者一个提示信息
# 并记录这个错误,便于后期改进
"""
try:
可能发生异常的代码
except 异常的类型:
发生异常执行的代码
"""
print('其他的代码...')
num = input('请输入一个数字:')
# ZeroDivisionError: division by zero
# ValueError: invalid literal for int() with base 10: 'a'
try:
num = 10 / int(num)
print('计算得到的结果是:', num)
except ZeroDivisionError:
print('你输入有误,请再次输入!')
print('其他的代码...')
03、捕获多个异常[掌握]
3.1、写法1-合并写法
"""
try:
可能发生异常的代码...
except (异常类型1, 异常类型2, ...):
发生异常执行的代码...
"""
print('其他的代码...')
num = input('请输入一个数字:')
# ZeroDivisionError: division by zero
# ValueError: invalid literal for int() with base 10: 'a'
try:
a = int(num)
num = 10 / a
# num = 10 / int(num)
print('计算得到的结果是:', num)
except (ZeroDivisionError, ValueError):
print('你输入有误,请再次输入。')
print('其他的代码...')
3.2、写法2-分开写法
"""
try:
可能发生异常的代码
except 异常类型1:
发生异常1执行的代码...
except 异常类型2:
发生异常2执行的代码...
except ...:
pass
"""
print('其他的代码...')
num = input('请输入一个数字:')
# ZeroDivisionError: division by zero
# ValueError: invalid literal for int() with base 10: 'a'
try:
a = int(num)
num = 10 / a
# num = 10 / int(num)
print('计算得到的结果是:', num)
except ZeroDivisionError:
print('你输入有误,请再次输入。')
except ValueError:
print('输入有误,请输入数字。')
print('其他的代码...')
04、打印异常信息[掌握]
"""
try:
可能发生异常的代码...
except (异常的类型1, 异常类型2, ...) as 变量名:
发生异常执行的代码...
print(变量名)
"""
print('其他的代码...')
num = input('请输入一个数字:')
# ZeroDivisionError: division by zero
# ValueError: invalid literal for int() with base 10: 'a'
try:
a = int(num)
num = 10 / a
print('计算得到的结果是:', num)
except (ZeroDivisionError, ValueError) as e:
print('你输入有误,请再次输入。', e)
print('其他的代码...')
05、捕获所有的异常[掌握]
print('其他的代码...')
num = input('请输入一个数字:')
try:
a = int(num)
num = 10 / a
print('计算得到的结果是:', num)
f = open('1.txt', 'r')
except Exception as e:
print('你输入有误,请再次输入。', e)
print('其他的代码...')
06、异常的完整结构[掌握]
print('其他的代码...')
num = input('请输入一个数字:')
try:
a = int(num)
num = 10 / a
print('计算得到的结果是:', num)
except Exception as e:
print('你输入有误, 请再次输入。', e)
else:
print('没有发生异常, 我会执行。')
finally:
print('不管有没有发生异常, 我都会执行。')
print('其他的代码...')
07、异常的传递[理解]
7.1、异常传递1-try嵌套
print('其他的功能代码...')
num = input('请输入数字:')
try:
try:
a = int(num) # ValueError
except ZeroDivisionError:
print('发生异常。')
finally:
print('finally我都执行了...')
num = 10 / a
print(f'计算的结果:<<{num}>>')
except Exception as e:
print(e)
print('其他的功能代码...')
7.2、异常传递2-函数嵌套调用
def func1():
print('-------1---------')
num = input('请输入数字:') # 0
num = 10 / int(num) # 假设0是计算的出来的
print(num)
print('-------2---------')
def func2():
print('-------3---------')
func1()
print('-------4---------')
try:
print('-------5---------')
func2()
print('-------6---------')
except Exception as e:
print('-------7---------')
print(e)
# 5 3 1 7
08、抛出自定义异常[理解]
# 定义异常类, 密码长度不足的异常
class PasswordLengthError(Exception):
def __str__(self):
return 'xxxxxx'
pass
def get_password(): # 等同于系统定义函数
password = input('请输入密码:')
if len(password) >= 8:
print('密码长度合格。')
else:
# 抛出异常
raise PasswordLengthError('密码长度不足8位。')
print('密码长度不足8位!!!')
try:
get_password() # 调用系统的函数
except PasswordLengthError as e:
print(e)
print('其他代码...')
09、模块
9.1、模块的制作
9.2、模块的导入
# 想要使用模块中的内容,必须先导入模块
# 导入模块方法1:import 模块名
# 使用:模块名.功能名
import my_module1
print(my_module1.num) # 使用my_module1中的变量num
my_module1.func() # 调用my_module1中的func函数
dog = my_module1.Dog() # 调用my_module1中的类创建对象
dog.show_info()
# 导入模块方法2:from 模块名 import 功能名1, 功能名2, ....
# 使用:功能名
# 注意点:如果存在同名的方法名,则会被覆盖
from my_module2 import func, num
from my_module1 import num
func()
print(num)
# 导入模块方法3:from 模块名 import * # 将模块中所有的功能进行导入
# 使用:功能名
from my_module2 import *
print(num)
func()
dog = Dog()
dog.show_info()
# as:起别名,可以对模块和功能起别名.
# 注意:如果使用as别名,就不能再使用原来的名字.
import my_module1 as mm1
from my_module1 import func as m1_func
from my_module2 import func as m2_func
mm1.func()
m1_func()
m2_func()
9.3、模块中的变量__all__
9.4、模块中的变量__name__
9.5、模块的注意点
# 自己定义的模块名字,不要和系统中你要使用的模块名字相同
import random
import sys
# 模块的搜索顺序:当前目录 ---> 系统目录 ---> 程序报错
# sys.path保存模块查找顺序
print(sys.path) # ['F:\\JetBrains\\2pythonSpace\\pythonCode\\day10-异常和模块',...
a = random.randint(1, 5)
print(a) # 4
10、包的使用
# 导入包方法1:import 包名.模块名
import my_package.my_module1
import my_package.my_module2 as mm2
my_package.my_module1.func()
# mm2.func()
# 导入包方法2:from 包名.模块名 import 功能名
from my_package.my_module1 import func
from my_package.my_module2 import *
func()
# 导入包方法3:from 包名 import * # 导入的是__init__.py中的内容
from my_package import *
func()
11、学生管理系统-面向对象版
11.1、面向对象开发的一般方式
11.2、搭建框架代码
11.3、实现添加学生的功能
11.4、删除/修改/查询-学生信息
def __remove_student(self): # 2.删除学生
# 1.使用input()输入学生学号
stu_id = input('请输入学号:')
# 2.判断学生信息是否存在
if stu_id in self.stu_dicts:
# 3.存在则进行操作,删除字典中的数据:del 变量[key]
del self.stu_dicts[stu_id]
print('学生已经删除.')
else:
print('学生信息不存在,无法删除...')
def __modify_student(self): # 3.修改学生信息
# 1.使用input()输入学生学号
stu_id = input('请输入学号:')
# 2.判断学生信息是否存在
if stu_id in self.stu_dicts:
# 3.修改对象的属性:对象.属性名 = 属性值
stu = self.stu_dicts[stu_id] # 字典[key]
stu.age = input('请输入新的年龄:')
print('信息已经修改完毕.....')
else:
print('学生信息不存在,无法删除.....')
def __search_student(self): # 4.查询单个学生信息
# 1.使用input()输入学生学号
stu_id = input('请输入学号:')
# 2.判断学生信息是否存在
if stu_id in self.stu_dicts:
# 3.输出学生对象的信息
stu = self.stu_dicts[stu_id] # 字典[key]
print(stu)
else:
print('学生信息不存在,无法删除.....')
11.5、保存
def __save(self): # 保存所有的学生信息
f = open('student.txt', 'w', encoding='utf-8')
for stu in self.stu_dicts.values():
f.write(str(stu) + '\n') # str(stu):调用student类中的__str__ 方法
f.close()
11.6、读取
def __load_info(self): # 读取所有的学生信息
try:
f = open('student.txt', 'r', encoding='utf-8')
buf_list = f.readlines()
for buf in buf_list:
buf = buf.strip() # 去重\n
info_list = buf.split(',') # 列表
# 创建对象
# stu = student.Student(info_list[0], info_list[1], info_list[2], info_list[3])
stu = student.Student(*info_list) # *列表:将列表中的数据逐个赋给变量
# 将对象添加到字典中
stu_id = info_list[0]
self.stu_dicts[stu_id] = stu
f.close()
except Exception:
pass
11.7、面向对象版-学生管理系统-代码汇总
11.7.1、main.py
import student_manager_system as sms
if __name__ == '__main__':
stu_sms = sms.StudentManagerSystem() # 创建对象
stu_sms.start() # 调用start()方法
11.7.2、student.py
class Student(object):
def __init__(self, stu_id, name, age, gender):
self.stu_id = stu_id
self.name = name
self.age = age
self.gender = gender
def __str__(self):
return f"{self.stu_id},{self.name},{self.age},{self.gender}"
if __name__ == '__main__':
stu = Student(1, 'aa', 18, 'm')
print(stu)
11.7.3、student_manager_system.py
import student
class StudentManagerSystem(object):
def __init__(self):
self.stu_dicts = {}
@staticmethod
def __show_menu():
print('1.添加学生')
print('2.删除学生')
print('3.修改学生信息')
print('4.查询单个学生信息')
print('5.查询所有的学生信息')
print('6.退出系统')
def __insert_student(self): # 1.添加学生
# 1.使用input()获取学生的信息
stu_id = input('请输入学生学号:')
# 代码优化:判断学生信息是否存在->学号是否存在->判断字典的key是否存在
if stu_id in self.stu_dicts: # key存在返回True
print('学生信息已经存在, 不需要再次添加.........')
return
name = input('请输入学生名字:')
age = input('请输入学生年龄:')
gender = input('请输入学生性别:')
# 2.使用学生信息,创建学生对象-学生类(参数)
stu = student.Student(stu_id, name, age, gender)
# 3.将学生对象添加的字典中:字典['key'] = 数据值
self.stu_dicts[stu_id] = stu
def __remove_student(self): # 2.删除学生
# 1.使用input()输入学生学号
stu_id = input('请输入学号:')
# 2.判断学生信息是否存在
if stu_id in self.stu_dicts:
# 3.存在则进行操作:删除字典中的数据:del 变量[key]
del self.stu_dicts[stu_id]
print('学生已经删除.')
else:
print('学生信息不存在,无法删除...')
def __modify_student(self): # 3.修改学生信息
# 1.使用input()输入学生学号
stu_id = input('请输入学号:')
# 2.判断学生信息是否存在
if stu_id in self.stu_dicts:
# 3.修改对象的属性:对象.属性名 = 属性值
stu = self.stu_dicts[stu_id] # 字典[key]
stu.age = input('请输入新的年龄:')
print('信息已经修改完毕.....')
else:
print('学生信息不存在,无法删除.....')
def __search_student(self): # 4.查询单个学生信息
# 1.使用input()输入学生学号
stu_id = input('请输入学号:')
# 2.判断学生信息是否存在
if stu_id in self.stu_dicts:
# 3.输出学生对象的信息
stu = self.stu_dicts[stu_id] # 字典[key]
print(stu)
else:
print('学生信息不存在,无法删除.....')
def __show_all_info(self): # 5.查询所有的学生信息
for stu in self.stu_dicts.values():
print(stu)
def __save(self): # 保存所有的学生信息
f = open('student.txt', 'w', encoding='utf-8')
for stu in self.stu_dicts.values():
f.write(str(stu) + '\n') # str(stu):调用student类中的__str__ 方法
f.close()
def __load_info(self): # 读取所有的学生信息
try:
f = open('student.txt', 'r', encoding='utf-8')
buf_list = f.readlines()
for buf in buf_list:
buf = buf.strip() # 去重\n
info_list = buf.split(',') # 列表
# 创建对象
# stu = student.Student(info_list[0], info_list[1], info_list[2], info_list[3])
stu = student.Student(*info_list) # *列表:将列表中的数据逐个赋给变量
# 将对象添加到字典中
stu_id = info_list[0]
self.stu_dicts[stu_id] = stu
f.close()
except Exception:
pass
def start(self):
self.__load_info()
while True:
self.__show_menu()
opt = input('请输入用来选择的操作编号:')
if opt == '1':
# print('1.添加学生')
self.__insert_student()
elif opt == '2':
# print('2.删除学生')
self.__remove_student()
elif opt == '3':
# print('3.修改学生信息')
self.__modify_student()
elif opt == '4':
# print('4.查询单个学生信息')
self.__search_student()
elif opt == '5':
# print('5.查询所有的学生信息')
self.__show_all_info()
elif opt == '6':
self.__save()
print('欢迎下次使用本系统......')
break
else:
print('输入有误,请再次输入.')
continue
input('...... 回车键继续操作.......')