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              传入一个调用者不期望的值,即使值的类型是正确的
View Code

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

  

 

 

 

 

posted @ 2018-03-17 01:27  你是我的神奇  阅读(155)  评论(0编辑  收藏  举报