0
点赞
收藏
分享

微信扫一扫

Python基础day10【异常、模块、包、面向对象版-学生管理系统】

目录

00、复习和反馈

01、异常的概念[了解]

02、捕获单个异常[掌握]

03、捕获多个异常[掌握]

3.1、写法1-合并写法

3.2、写法2-分开写法

04、打印异常信息[掌握]

05、捕获所有的异常[掌握]

06、异常的完整结构[掌握]

07、异常的传递[理解]

7.1、异常传递1-try嵌套

7.2、异常传递2-函数嵌套调用

08、抛出自定义异常[理解]

09、模块

9.1、模块的制作

9.2、模块的导入

9.3、模块中的变量__all__

9.4、模块中的变量__name__

9.5、模块的注意点

10、包的使用

11、学生管理系统-面向对象版

11.1、面向对象开发的一般方式

11.2、搭建框架代码

11.3、实现添加学生的功能

11.4、删除/修改/查询-学生信息

11.5、保存

11.6、读取

11.7、面向对象版-学生管理系统-代码汇总

11.7.1、main.py

11.7.2、student.py

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('...... 回车键继续操作.......')
举报

相关推荐

0 条评论