单例模式、异常
一、设计模式
- 单例模式:
- 解释:
- 只有一个实例(一个对象)
- 场景:
- 数据库连接池为一个class,只应该实例化出一个连接池对象,每次请求都请求这个对象,从池中获取链接
- 而不应该每个请求都实例化一个连接池对象
- example:
class Class1:obj = None # 静态字段,用来保存创建的实例
def __init__(self, name):self.name = name
@classmethod # 会使用静态字段,而类中的静态字段是使用 类名.字段进行访问,所以使用今天方法,cls获取类名称def get_inst(cls):if cls.obj: # 若实例存在,则直接返回该实例return cls.objelse:cls.obj = cls('qiaogy') # 调用__init__方法,创建一个实例,保存至静态字段中return cls.obj # 返回该实例
# 使用新的 get_inst 方法来去创建实例,在该方法内部判断# 若第一次获取,则创建实例;若后续获取,则返回第一次创建的实例obj1 = Class1.get_inst()obj2 = Class1.get_inst()print(obj1,obj2,sep='\n') # 此时,不管实例化多少次,只会返回第一次创建的实例
二、异常处理:
- 异常种类:
- 常用异常类:
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性xIOError 输入/输出异常;基本上是无法打开文件ImportError 无法引入模块或包;基本上是路径问题或名称错误IndentationError 语法错误(的子类) ;代码没有正确对齐IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]KeyError 试图访问字典里不存在的键KeyboardInterrupt Ctrl+C被按下NameError 使用一个还未被赋予对象的变量SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)TypeError 传入对象类型与要求的不符合UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它ValueError 传入一个调用者不期望的值,即使值的类型是正确的
- 万能异常类:
Exception 捕获所有异常错误
- 完整格式
# 所有正常代码try:pass
# 异常执行代码;精确匹配的写在上面,范围大的写在下面except IndexError as ex:print(ex)except Exception as ex:print(ex)
else:# 没有任何异常,则执行该代码块passfinally:# 不论有没有异常,都执行该代码pass
- 执行流程:
try中:user_inp = input('number: ')b = int(user_inp)print(b) # 若上面int异常,则直接跳到下面异常捕获段落,异常后面的代码是不会执行的,所以要卸载else或finally
- 主动触发异常:
try:raise Exception('主动错误信息') # 在Exception类实例化,并传参数,相当于 self.message = ‘主动错误’except Exception as ex:print(ex) # 相当于执行 __str__方法中,return self.message,return什么就显示什么
此时:想抛什么抛什么,eg raise IndexError('xxx')
- 自定义异常:
# 自定义异常类,继承class MyException(Exception):def __init__(self, message):self.message = message
def __str__(self):return self.message
# 调用try:raise MyException('我的异常')except MyException as ex:pinrt(ex)
三、断言:
- assert 条件 ,条件为真,不报错;条件为假,抛异常
assert 1==2 # 相当于if else + raise异常