天天看点

python学习------------异常以及反射

    学完这一节,python基础部分就要告一段落了,期待进入新一阶段的学习,也给自己说坚持就是胜利。

一、isinstance(obj,cls)

检查obj是否是cls的对象

1、首先从学过的变量开始

其实也就是说:变量a,b是对象,是否是属于int,str的类,属于返回True,不属于返回False

2、类中的对象和类之间的关系

3、对象和基类的关系

总结:

isinstance是判断一个对象是否属于类

就是对象和类的关系

对象和基类的关系

二、issubclass(sub,super)

检查sub是否是super的派生类

三、异常处理

1、产生的缘由

    为了在编程过程中,增加和用户交互的友好性,在程序出现错误时不将错误信息显示给用户,也就是不会出现我们通常浏览页面时出现的大黄页,而是显示一个错误提示的界面。

2、在python中处理异常的方法 

在try中是正确的逻辑代码

在except中是代码逻辑块出现错误

例如:

在一块代码中,加入我输入数字,程序不会报错,而当我输入字母时,程序就会报错。

而在加了try和except块的代码时,当输入数字时,程序依然不会报错,而输入非数字时就会打印提示信息,让你输入数字。

通过以上对比,可以看出加了异常处理的代码比没加异常处理的代码的用户交互的友好性提高了很多。

3、异常的种类

1)、指定的异常

上述代码异常都是指定的是特定的错误处理,例如key,index,value等,但是这样处理也会存在一定的问题,例如:

针对这样的问题,一般我们处理异常时一般写成如下的异常处理顺序

也就是说先写特殊的,最后写最终的Exception,Exception也被叫做万能异常,可以捕获任意异常。

但是反过来会说,既然有了万能异常可以捕获任意的异常,还需要特殊异常做什么?

答案是这样的:对于特殊处理或提醒的异常需要先定义,最后定义Exception来确保程序运行正常。

总结一下特殊的异常

ArithmeticError

AssertionError

AttributeError

BaseException

BufferError

BytesWarning

DeprecationWarning

EnvironmentError

EOFError

Exception

FloatingPointError

FutureWarning

GeneratorExit

ImportError

ImportWarning

IndentationError

IndexError

IOError

KeyboardInterrupt

KeyError

LookupError

MemoryError

NameError

NotImplementedError

OSError

OverflowError

PendingDeprecationWarning

ReferenceError

RuntimeError

RuntimeWarning

StandardError

StopIteration

SyntaxError

SyntaxWarning

SystemError

SystemExit

TabError

TypeError

UnboundLocalError

UnicodeDecodeError

UnicodeEncodeError

UnicodeError

UnicodeTranslateError

UnicodeWarning

UserWarning

ValueError

Warning

ZeroDivisionError

4、异常的大结构

5、主动触发异常

如果返回的值为假,则就会主动触发错误,即raise Exception("出现错误")

小结:

1、以上关于异常的处理中,都会有一个e:它的作用是什么?

答案:e是对象,将IndexError等都封装到e中,相当于类中的字段封装的对象中。

2、Exception和这些特殊的处理IndexError是什么关系?

答案:Exception是他们的基类。

3、为什么下面的异常会打印这样的提示?

try:

   int("aa")

except Exception,e:

   print e

#异常结果为:invalid literal for int() with base 10: 'aa'

首先给出答案:它是由类中的__str__方法产生的

这样可以看出我们在异常中print e的结果是一个字符串,而在类中print 对象是内存地址,那怎么做才能和print e一致呢?

在类中加入__str__方法,再次print 对象,就会打印一个字符串,这就和在异常中打印invalid literal for int() with base 10: 'aa'原理一样了。

本质为:在异常中e是对象,而Exception是类,也就是对象e调用类Exception中的__str__方法得到的结果。

6、自定义异常

7、断言:assert

作用在程序调试时,判断程序是否正确,用于debug

assert 条件

如果条件为真,不会报错,否则,程序报错

assert 1==1

assert 1==2

四、反射

1、python中的反射功能是由四种内置函数来提供的,hasattr,setattr,getattr,delattr这四个内置函数分别用于对对象内部执行:检查是否含有某成员,设置某成员,获取某成员,删除成员

2、下面通过例子一步步的讨论反射:

1)、我们模拟web为例

home.py

这就是说我们输入对应的url,再进行判断找到符合条件的url,返回值

下面我们采用反射来进行操作

这样一来在上面的代码中就不需要再进行判断,只需去在home模块中寻找符合的url,这对于大量的url来说,用反射就简单了。

2)对四种内置函数产生的结果进行比较

3)在web上进行测试(练习反射)

3、反射操作类和对象中的成员

为什么对象中只有name,而用hasattr(obj,'show')却显示为True,因为对象中存在类对象指针,对象首先在自己的内存中找,如果没有找到再到类中找,所以就会显示找到,返回结果为True

4、上面的操作都是在自己模块的内部执行,接下来看在其他模块执行效果

一句话总结反射:在容器中找对象的元素

5、动态导入模块

五、单例模式

单例就是单个实例

单例模式存在的目的就是保证内存中只存在一个实例,避免内存浪费

用两个例子对比说明单例模式

1、不使用单例模式

这样创建实例SqlHelper(1),但生成的id不同,占用大量内存。

2、采用单实例模式

1、创建静态字段__static_instance = None 保存永远存在内存的实例

2、调用类方法@classmethod,返回那个对象

3、通过类对象获取永远存在内存的实例

这就是创建单例模式的要点。。。。。

参考来源:

http://www.cnblogs.com/wupeiqi/

以及老男孩python开发视频