Python-Basis-16th
周六,晴,记录生活分享点滴
参考博客:https://www.cnblogs.com/wupeiqi/articles/5017742.html
Python版本:3.5
异常处理
在程序出现bug时一般不会将错误信息显示给用户,而是显示在一个提示的页面
while True: try: inp = input('请输入序号:') # 1.1代码块:自定义代码逻辑 i = int(inp) # 1.2上述代码块如果出错,自动执行当前块的内容 except Exception as e: # 2. e是Exception对象,对象中封装了错误信息 print(e) i = 1 print(i)
部分错误类型及执行顺序
def fun(): ret = 0 try: li = [11, 22] li[1] # 3. 如果在执行中出现错误,下面的条件不会再执行,如果想执行下面的条件,需要把当前的错误修正 int('w3r') # 2.1 如果出错,执行except except IndexError as e: # 1. 逐步筛选错误类型,exception范围最大 print('IndexError',e) except ValueError as e: print('ValueError',e) except Exception as e: print('Exception',e) # 2.2 如果没有出错,执行else else: ret = 1 print('elese') # 2.3 最后无论是否出错,肯定执行 finally: print('....')
try: raise Exception('不过了...') # 主动触发异常 except Exception as e: print(e)
主动触发异常应用:通过文件状态判断将此时的文件情况记录到日志中
def db(): return False # 或者设定为 return True def index(): try: r = input(">>") int(r) # 1. 如果1出错,执行exception,3记录日志 result = db() if not result: # 2. 如果1正确,2出错,执行exception,3记录日志 raise Exception('数据库处理错误') # 可以主动触发异常,不需要重复写3记录日志操作 except Exception as e: str_error = str(e) print(str_error) r = open('log', 'a') # 3. 打开文件,写日志 r.write(str_error) index()
class HelloError(Exception): def __init__(self, msg): self.message = msg def __str__(self): return self.message try: raise HelloError('我错了...') # 自定义异常HelloError except HelloError as e: print(e) # 执行e对象的__str__()方法,获取__str__()返回值:“我错了...”
assert 条件叫断言,用于强制用户服从,不服从就报错,可捕获,一般不捕获
print(23) assert 1==2 # 条件成立,不执行assert;条件不成立,执行assert,报错AssertionError print(456)
反射
hasattr、getattr、setattr、delattr
这四个函数分别用于对象中的内部执行:检查是否含有某成员、获取成员、设置成员、删除成员
class Foo(object): def __init__(self): self.name = 'chung' 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')
详细解析
class Foo(object): def __init__(self): self.name = 'chung' def func(self): return 'func' obj = Foo() # 访问字段 obj.name # name和func是变量名 # 执行方法 obj.func() # obj.xxx表示在obj中或类中寻找变量名xxx,并获取对应内存地址中的内容
获取obj对象中的name变量指向内存中的值 “chung”
方式一
class Foo(object): def __init__(self): self.name = 'alex' def func(self): return 'func' # 不允许使用 obj.name obj = Foo() print obj.__dict__['name']
方式二
class Foo(object): def __init__(self): self.name = 'alex' def func(self): return 'func' # 不允许使用 obj.name obj = Foo() print getattr(obj, 'name')
小结
反射是通过字符串的形式操作对象相关的成员。一切事物都是对象。
类是对象
class Foo(object): staticField = "old boy" def __init__(self): self.name = 'wupeiqi' def func(self): return 'func' @staticmethod def bar(): return 'bar' print getattr(Foo, 'staticField') print getattr(Foo, 'func') print getattr(Foo, 'bar')
模块是对象
# home.py文件中
def dev(): return 'dev'
# --------这是一条分割线-----------
""" 程序目录: home.py index.py 当前文件: index.py """ import home as obj #obj.dev() func = getattr(obj, 'dev') func()
单例模式
单例模式用来保证内存中仅存在一个实例
# ########### 单例类定义 ########### class Foo(object): __instance = None @staticmethod def singleton(): if Foo.__instance: return Foo.__instance else: Foo.__instance = Foo() return Foo.__instance # ########### 获取实例 ########### obj = Foo.singleton()
小结:
单例模式中创建对象时不能再直接使用:obj = Foo(),而应该调用特殊的方法:obj = Foo.singleton()
保证当前内存中仅存在单个实例,避免内存浪费