Python基础_Day14

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.单例设计模式

猜你喜欢

转载自blog.csdn.net/weixin_42076261/article/details/88421489