Day8 - Python基础8 异常处理、反射、单例模式
本节内容:
1:异常处理
2:反射
3:单例模式
1.异常处理
1、异常简介
在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面,通俗来说就是不让用户看见大黄页!!!
try: pass except Exception,ex: ##Exception 可以捕捉到任何异常,万能牌 pass
2、异常种类
python中的异常种类非常多,每个异常专门用于处理某一项异常!!!
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError 输入/输出异常;基本上是无法打开文件 ImportError 无法引入模块或包;基本上是路径问题或名称错误 IndentationError 语法错误(的子类) ;代码没有正确对齐 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5] KeyError 试图访问字典里不存在的键 KeyboardInterrupt Ctrl+C被按下 NameError 使用一个还未被赋予对象的变量 SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了) TypeError 传入对象类型与要求的不符合 UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它 ValueError 传入一个调用者不期望的值,即使值的类型是正确的
3、异常其他结构
try: # 主代码块 pass except KeyError,e: # 异常时,执行该块 pass else: # 主代码块成功执行完,执行该块 pass finally: # 无论异常与否,最终执行该块 pass
4、主动触发异常
try: raise Exception('错误了。。。') except Exception,e: print e
5、自定义异常
class NickException(Exception): def __init__(self, msg): self.message = msg def __str__(self): return self.message try: raise NickException('我的异常') except NickException,e: print e
6、断言
在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行最崩溃, 不如在出现错误条件时就崩溃,这时候就需要assert断言的帮助。 # assert 条件 # 条件成立则pass,条件不成立则报错 assert 1 == 1 assert 1 == 2 assert 1==2,'1不等于2' ##加上错误提示 assert 表达式[,'错误提示']
2:反射
python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员、获取成员、设置成员、删除成员。
模块和类都是对象!
class Foo(object): def __init__(self): self.name = 'wupeiqi' def func(self): return 'func' obj = Foo() # #### 检查是否含有成员 #### hasattr(obj, 'name') hasattr(obj, 'func') # #### 获取成员 #### getattr(obj, 'name') getattr(obj, 'func') # #### 设置成员 #### setattr(obj, 'age', 18) setattr(obj, 'show', lambda num: num + 1) # #### 删除成员 #### delattr(obj, 'name') delattr(obj, 'func')
通过字符串进行导入模块:
# 通过字符串的形式,导入模块。起个别名 ccas。 comm = input("Please:") ccas = __import__(comm) ccas.f1() # 需要做拼接导入时后加 fromlist=True(否则只导入lib) ccas = __import__("lib."+comm, fromlist=True)
3:单例模式
先看下面代码:
class Foo(): def __init__(self,name,age): self.name = name self.age = age obj1 = Foo() ##我们说obj1是一个对象,其实obj1也叫做Foo类的 一个实例 obj1 = Foo() obj1 = Foo() ###我们这样是不是就意味着,我们在内存中创建了三个实例对象
那么所谓的单例,就是说我在内存中只保存一份实例(对象),
单例模式存在的目的是保证当前内存中仅存在单个实例,避免内存浪费!!!
(程序如果并发量大的话,内存里就会存在非常多功能上一模一样的对象。存在这些对象肯定会消耗内存,对于这些功能相同的对象可以在内存中仅创建一个,需要时都去调用)
# ########### 单例类定义 ########### class Foo(object): __instance = None @staticmethod def singleton(): if Foo.__instance: return Foo.__instance else: Foo.__instance = Foo() return Foo.__instance # ########### 获取实例 ########### obj = Foo.singleton()
对于Python单例模式,创建对象时不能再直接使用:obj = Foo(),而应该调用特殊的方法:obj = Foo.singleton() 。
应用场景:
1:数据库的连接池
只创建一个链接数目,每一个用户都是使用这个数据库链接
装饰器方式的单例模式:
# 装饰器方式单例模式 def singleton(argv): dic = {} def s(*args, **kwargs): if argv not in dic: dic[argv] = argv(*args, **kwargs) return dic[argv] else: return dic[argv] return s # 类上加单例装饰器 @singleton class Foo: pass @singleton class Foo2: pass