本周先继续介绍了面向对象的两个特殊的方法
一、面向对象相关
1、isinstance(obj, cls)
它的作用就是检查某个对象obj是否被指定类创建,如果是就返回True,不是就是返回False。
例如,c是有A()类创建的实例
c是有A()类创建的实例
class A(object): pass #c是有A()类创建的实例 c=A() print isinstance(c,A) True
如果B()类继承了A()类,c是由B()类创建的。那么c即是B()类创建的也同时是A()类创建的,所以返回的都是True
class A(object): pass class B(A): pass #c是由B()类创建的实例 c=B() print isinstance(c,B) print isinstance(c,A) True True
那这个功能到底有什么用呢?我们知道python中有很多的数据类型。例如str,dic,list,int等等。在python的世界里有一句话“一切皆为对象”,对象又是通过类创造出来的。那么起始str,dic这些对象都是由一个type基类创造出来的。字符串、字典的类先要继承基类type(),然后才能创队创造对象。说了这么多绕弯的话,其实就是想告诉大家,因为列表、字典也是类创造出来的对象,所以也适用于isinstance()方法。用来判断传过来的数据是不是指定的数据类型。记住最后一句就行了
例如,传过来的是123。但是我们并不知道是str还是int,那怎么办?通过isinstance()的返回的值
我们就能知道数据的类型了,这个方法以后编程会大量用到。
s=123 if isinstance(s,str): print ‘This string‘ if isinstance(s,int): print ‘This int‘ This int
2、issubclass(sub, super)
这个方法的作用就是判断两个类是否是基类和派生类的关系,如果是就返回True,不是就返回False
这个方法用的不多,知道就可以了
class A(object): pass #B()类继承了A() class B(A): pass #C类和A、B都没有关系 class C(object): pass print issubclass(B,A) print issubclass(C,A) True False
二、异常的处理
1、异常的基础
python中经常会出现各种各样的错误异常,比如要求输入的数据类型是数字,但是我输入的是字符串就会引发TypeError错误。
num=raw_input(‘please input number:‘) print num+1 please input number:3 Traceback (most recent call last): File "F:/python_file/test.py", line 4, in <module> print num+1 TypeError: cannot concatenate ‘str‘ and ‘int‘ objects
如果不想看到这样的错误信息,其实我们可以手动捕获异常然后打印出发到指定错误之后的错误信息
try: num=raw_input(‘please input number:‘) print num+1 except TypeError,e: #except后面的参数就是要捕获的异常类型,e里面包含的是系统默认的该种异常说明 print e #打印出来系统对该种异常的说明 please input number:3 cannot concatenate ‘str‘ and ‘int‘ objects
e这个参数其实也不是必须的,如果我不想使用系统默认的说明。我们也可以自己定义触发到指定异常之后屏幕上到底打印什么
try: num=raw_input(‘please input number:‘) print num+1 except TypeError: print ‘you input wrong type‘ please input number:3 you input wrong type
2、异常的种类
上面看到的TypeError只是能够触发python异常的其中一种而已,那python中到底有多少个可以触发异常的错误呢?请看下表
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
看着是不是有点吓人?这么大一堆,其实数量虽然多但是我们经常碰到的也就是下面这几种
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError 输入/输出异常;基本上是无法打开文件 ImportError 无法引入模块或包;基本上是路径问题或名称错误 IndentationError 语法错误(的子类) ;代码没有正确对齐 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5] KeyError 试图访问字典里不存在的键 KeyboardInterrupt Ctrl+C被按下 NameError 使用一个还未被赋予对象的变量 SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了) TypeError 传入对象类型与要求的不符合 UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它 ValueError 传入一个调用者不期望的值,即使值的类型是正确的
我们通过捕获上述的异常,就在出现相应的错误时候进行相应的处理。例如运行程序的时候用户输入
Ctrl+C按键退出程序,如果我们能捕获KeyboardInterrupt这个异常,就可以让用户退不出去
import time for i in range(10): try: print i time.sleep(1) except KeyboardInterrupt: print "I cant`t stop it" continue 0 1 2 I cant`t stop it 3 4
3、万能异常
这么多种类的异常肯定不能在定义的时候全都写上,这时候就可以使用万能异常Exception。这个万能异常可以捕获所有的异常。这样就不用每个异常都输入一遍了。大概的结构如下
try: pass except Exception,e: print e
4、自定义异常
python虽然提供了很多种的异常,但是有时候我们可能根据业务需要有自定义异常的需求,那这个自定义的异常怎么写呢,示例如下:
class my_error(Exception):#要自己先定义一个类,这个类必须继承(Exception) def __init__(self,msg=None): self.msg=msg """ __str__方法是提供给print打印时候用到的,所有打印的结果都是调用了__str__方法的结果 """ def __str__(self): #定义触发异常后 print e时候打印出来的内容 if self.msg: return self.msg else: return ‘my define error‘
这样就定义好了一个我们自己的异常,只要出发了这个异常就会显示我们定义的内容。但是问题来了,我们怎么才能出发自己的异常。答案就是在try下面通过关键字raise,完整的代码如下:
class my_error(Exception):#要自己先定义一个类,这个类必须继承(Exception) def __init__(self,msg=None): self.msg=msg """ __str__方法是提供给print打印时候用到的,所有打印的结果都是调用了__str__方法的结果 """ def __str__(self): #定义触发异常后 print e时候打印出来的内容 if self.msg: return self.msg else: return ‘my define error‘ try: raise my_error()#通过关键字raise 触发我们自定义的异常。这个办法也可以用来触发系统自带的各种异常 except Exception,e: #这个e就相当于e=my_error.__str__(),本例中获取的就是用户输入的信息或‘alex error‘ print e my define error
4、异常的其他结构
虽然有了异常,但是代码不可能每次运行都会触发到。python的异常提供了一个代码结构,用这个结构写的话代码会显得清晰点,当然如果不用也可以实现功能。按照老师的话讲就是提升逼格的神器,用异常实现数据库连接的逻辑示例如下:
try: #逻辑代码 连接数据局,执行sql pass except IndexError,e: #定义不同类型的异常 pass except KeyError,e: else: #逻辑代码块未见异常 pass finally: #断开连接,释放资源 #永远执行,逻辑代码执行完之后 pass
这个结构的运行的逻辑流程图如下:
本文出自 “霹雳豆包” 博客,谢绝转载!
原文:http://830909.blog.51cto.com/8311014/1722900