单例模式、异常

 

一、设计模式
  • 单例模式:
    • 解释:
      • 只有一个实例(一个对象)       
    • 场景:
      • 数据库连接池为一个class,只应该实例化出一个连接池对象,每次请求都请求这个对象,从池中获取链接
      • 而不应该每个请求都实例化一个连接池对象
    • example:
class Class1:
obj = None   # 静态字段,用来保存创建的实例

def __init__(self, name):
self.name = name

@classmethod  # 会使用静态字段,而类中的静态字段是使用 类名.字段进行访问,所以使用今天方法,cls获取类名称
def get_inst(cls):
if cls.obj:  # 若实例存在,则直接返回该实例
return cls.obj
else:
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没有属性x
IOError                          输入/输出异常;基本上是无法打开文件
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:
# 没有任何异常,则执行该代码块
pass
finally:
# 不论有没有异常,都执行该代码
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异常








 










 

posted on 2016-08-29 16:53  台灯不太亮  阅读(167)  评论(0编辑  收藏  举报

导航