判断类与对象关系
isinstance(obj, cls)
判断对象obj是否是由cls类创建的
#!/usr/bin/env python #-*- coding:utf-8 -*- class Foo(object): pass obj = Foo() print isinstance(obj, Foo) #输出结果:True #如果对象obj是由Foo类创建的,那么就会返回True 否则返回False #!/usr/bin/env python #-*- coding:utf-8 -*- class Foo(object): pass class Boo(object): pass obj = Boo() print isinstance(obj,Foo) #输出结果:False
issubclass(Boo, Foo)
检查Boo类是否是 Foo类的派生类
#!/usr/bin/env python #-*- coding:utf-8 -*- class Foo(object): pass class Boo(Foo): pass print issubclass(Boo,Foo) #同理如果Boo,是Foo的派生类那么返回True
异常处理
一、异常处理的作用
在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面,通俗来说就是不让用户看见大黄页!(这里的大黄页通常是写代码是用户访问网页,如果出现错误之后返回的一个黄色的报错页面通常称为:大黄页)
例子:
拿咱们刚开始学的时候遇到的问题来举例:
#!/usr/bin/env python #-*- coding:utf-8 -*- str_input = 'tianshuai' number = int(str_input) print number 报错信息: ''' Traceback (most recent call last): File "C:/Github/homework/tianshuai/boke.py", line 5, in <module> number = int(str_input) ValueError: invalid literal for int() with base 10: 'tianshuai' '''
上面的信息是不是非常的不友好!
用异常处理来做:
try: str_input = 'tianshuai' number = int(str_input) print number except Exception,e: print "\033[32;1m出现错误如下\033[0m" print e #输出结果: ''' 出现错误如下 invalid literal for int() with base 10: 'tianshuai' '''
二、异常处理基础
拿下面的代码来说:
假如我有一个程序,获取用户输入的数字!这里我不能控制用户输入什么。
看下面输入了一个字符串,这里我可不可以用异常处理来告诉用户,你的输入字符串啊!
user_input = raw_input("\033[32;1m请输入数字:\033[0m") number = int(user_input) #请输入数字:sdlkf ''' Traceback (most recent call last): File "E:/ѧϰ/GitHub/homework/tianshuai/master.py", line 5, in <module> number = int(user_input) ValueError: invalid literal for int() with base 10: 'sdlkf' '''
假如我使用异常处理:
try: #正常逻辑代码 user_input = raw_input("\033[32;1m请输入数字:\033[0m") number = int(user_input) except Exception,e: #这个e是对象Exception类创建的!Exception这里面封装了你上面逻辑块出现问题的所有错误 #逻辑代码出现错误,这里的代码块就是如果上面的代码出现问题之后执行这个代码块的内容 print e #如果这个e你不想要,可以自己定义 #这里也可以记录日志,把错误的详细记录,错误详细在e里了! #结果: ''' 请输入数字:sdfs invalid literal for int() with base 10: 'sdfs' '''
三、异常处理种类
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError 输入/输出异常;基本上是无法打开文件 ImportError 无法引入模块或包;基本上是路径问题或名称错误 IndentationError 语法错误(的子类) ;代码没有正确对齐 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5] KeyError 试图访问字典里不存在的键 KeyboardInterrupt Ctrl+C被按下 NameError 使用一个还未被赋予对象的变量 SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了) TypeError 传入对象类型与要求的不符合 UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量, 导致你以为正在访问它 ValueError 传入一个调用者不期望的值,即使值的类型是正确的