1.枚举
枚举类型:把它看做是一组标签或者一系列常量的集合
什么时候使用枚举类型?
当一个类型的对象个数有限 且对象的值固定的请况下 可以将该类型设置为枚举类型
星期类
季节类型
月份类型
如何把一个类声明成枚举类型?
需要导入模块 enum
在这个模块下需要三个内容: Enum IntEnum @unique [保证对象的数据是唯一的不允许重复的]
如何想让一个类声明成枚举类型
这个类需要继承自Enum 或者 IntEnum
IntEnum要求对象的值是可以转化为整数
from enum import Enum, IntEnum, unique
# 声明一个季节类型
class Season(Enum):
# 在类体中声明的是该类的对象 对象名字命名规范:每个字母都是大写的 单词和单词之间使用下划线隔开
SPRING = "春"
SUMMER = "夏"
AUTUMN = "秋"
WINTER = "冬"
# 获得枚举类型的对象
obj = Season.SPRING
print(obj)
# 获得对象对应的值
value = Season.SPRING.value
print(value)
@unique
class Week(IntEnum):
MON = "1"
TUS = 2
WED = 3
THU = "4"
FRI = 5
SAT = 6
SUN = 7
WED = "三" # ValueError: invalid literal for int() with base 10: '三' IntEnum要求对象的值是可以转化为整数
value = Week.SUN.value
print(value)
2.异常机制
什么是异常?
在程序中不期而遇的各种状况
常见的异常:
ValueError
NameError
解释器是如何处理异常的?
出现异常的时候 Python解释器会在异常位置处 创建一个对应异常类型的对象 并将其抛出 检测出现异常的周围是否有处理该异常的机制 如果有的话就调用到处理异常的位置 如果没有 解释器将该异常捕获 并输出对应的异常信息 程序异常终止
程序员在代码中如何处理异常? —> 手动捕获
try:
可能会出现异常的代码
except 异常类型 as 变量:
捕获到异常
else:
这个模块可写可不写
如果写的话 执行时机是 只有当try块中不出现异常 才会执行else
捕获异常的时候 不知道具体的异常类型 就是用异常类的祖宗: Exception
list0 = [23, 45, 71, 89, 27]
try:
value = list0[5]
print(value)
print("hello")
except Exception as e:
print("出现了脚标异常:",e) # 出现了脚标异常: list index out of range
else:
print("没有异常")
练习:
键盘入一个字符串,将其转化为整数,如果输入的字符串不能转化为整数,让用户重新输入
提示: 不能转换为整数 ---> 判断时机就是异常的捕获位置处
while True:
input_str = input("请输入一个字符串:")
try:
res = int(input_str)
except ValueError as e:
print(e)
print("重新输入")
else:
break
print(res)
try:
可能会出现异常的代码
except 异常类型 as 变量:
捕获到了异常
finally:
这个模块可写可不写
如果写的话 执行时机是 无论有没有异常都会执行
list0 = [10, 20, 30, 50, 70]
try:
value = list0[5]
print(value)
except IndexError as e:
print(e)
finally:
print("执行了")
'''
list index out of range
执行了
'''
场景:
文件读写
打开文件
操作文件内容
关闭文件:因为程序无法处理程序之外的垃圾 读取文件时 是程序与外部文件之间建立通道 如果产生垃圾程序无法处理 需要手动关闭 [不管是否操作文件内容成功 都得进行关闭]
try:
handle = open("test.txt", "w", encoding="utf-8")
handle.write("a")
print(list0[5])
handle.write("B")
except Exception as e:
print(e)
finally:
handle.close()
print("执行了")
'''
list index out of range
执行了
'''
handle = None
try:
handle = open("test1.txt", "r", encoding="utf-8")
res = handle.read(2)
print(res)
print(list0[5])
res = handle.readline()
print(res)
except Exception as e:
print(e)
finally:
print("执行了")
if handle != None:
handle.close()
'''
[Errno 2] No such file or directory: 'test1.txt'
执行了
'''
手动抛出异常:
跟随在异常语句后面 raise 异常类型("异常信息")
讲解:
如果使用手动抛出 不管这一句是否出现异常 try中语句的执行都会中断 到异常处理的位置处
如果raise位于函数中 如果不想在函数内部做异常处理
处理方式:哪一块调用方法 哪一块进行异常处理
try:
list0 = [12, 34, 56, 7, 91]
value = list0[5]
raise IndexError("索引异常")
except IndexError as e:
print("异常捕获") # 异常捕获
print(e)
def show():
list0 = [12, 34, 56, 7, 91]
value = list0[4]
raise IndexError("索引异常")
try:
show()
except Exception as e:
print("调用方法的位置处进行异常处理", e)
'''
list index out of range
调用方法的位置处进行异常处理 索引异常
'''
手动抛出异常 一般是与 自定义异常结合使用的
什么情况下进行自定义异常:
不满足生活实际需求 出现的异常情况 这种异常情况系统并没有提供 可以进行自定义异常
案例:
年龄使用的是整数 ---> 年龄为负整数的时候 不满足生活实际需求的 出现了异常
自定义异常类型格式:
如果想让一个类型属于异常类型 需要让该类型继承自Exception
class 类型(Exception):
def __init__(self, message):
self.__message = message
def __str__(self):
return self.__message
'''
这个异常类型不是系统提供的 python解释器没有办法自动检测该异常信息
需要出现异常的时候手动抛出
'''
class AgeNevagiteError(Exception):
def __init__(self, message):
# 声明一个异常信息
self.__message = message
def __str__(self):
return "%s" % self.__message
__repr__ = __str__
class Person:
def __init__(self, name, age, sex):
self.set_name(name)
self.set_age(age)
self.set_sex(sex)
def set_name(self, name):
self.__name = name
def get_name(self):
return self.__name
def set_age(self, age):
if age < 0:
raise AgeNevagiteError("年龄为负数%d" % age)
else:
self.__age = age
def get_age(self):
return self.__age
def set_sex(self, sex):
if sex in ("男", "女"):
self.__sex = sex
else:
self.__sex = "男"
def get_sex(self):
return self.__sex
def __str__(self):
return "Person name:%s age:%d sex:%s" % (self.__name, self.__age, self.__sex)
__repr__ = __str__
from exception_pack.person_exception import *
def main():
person = None
try:
person = Person("田震", -20, "男")
except AgeNevagiteError as e:
print(e)
print(person)
if __name__ == '__main__':
main()
3.单例设计模式