day7-反射、异常处理
一、反射
通过字符串映射类中的属性或者方法
1 #coding:utf-8 2 class Dog(object): 3 def __init__(self,name,age): 4 self.name = name 5 self.age = age 6 def eat(self,food): 7 print("{0} is eating...{1}".format(self.name,food)) 8 9 # 定义一个bulk函数 10 def bulk(self): 11 print("{0} is yelling...".format(self.name)) 12 13 d = Dog("lulu", "8") 14 choice = raw_input(">>>:").strip() 15 16 # hasattr(obj,name_str):判断对象obj中是否存在name_str字符串的属性或方法 17 if hasattr(d,choice): 18 # getattr(obj,name_str):根据name_str字符串获取对象obj中对应方法的内存地址或者对应属性的值 19 name_value = getattr(d,choice) 20 if isinstance(name_value,str): 21 print(name_value) 22 else: 23 func = getattr(d, choice) 24 func('baozi') 25 26 else: 27 if choice == 'del': 28 choice = 'age' 29 # delattr(obj,name_str):删除对象obj中name_str字符串对应的属性或方法 30 delattr(d,choice) 31 print(hasattr(d, choice)) 32 else: 33 # setattr(obj,name_str,value):给对象obj添加一个新属性或者新方法==》obj.name_str = value 34 if choice != 'talk': 35 # 新增一个属性 36 setattr(d, choice, "0") 37 # 重新获取属性的值 38 print(getattr(d,choice)) 39 else: 40 # 新增一个方法 41 setattr(d,choice,bulk) 42 func = getattr(d,choice) 43 # 调用新增方法 44 func(d) 45 # 设置不存在的属性值为None 46 setattr(d,choice,None) 47 48 >>> 49 >>>:name 50 lulu 51 52 >>> 53 >>>:eat 54 lulu is eating...baozi 55 56 >>> 57 >>>:del 58 False 59 60 >>> 61 >>>:age 62 8 63 64 >>> 65 >>>:talk 66 lulu is yelling...
二、异常处理
1 #coding:utf-8 2 3 # 用try...except...处理异常 4 try: 5 data = {"a":"b"} 6 choice = raw_input(">>>") 7 print(data[choice]) 8 # 用统一处理方式处理异常 9 except (IndexError,KeyError) as e: 10 print(e) 11 # 捕捉意想不到的异常 12 except Exception as e: 13 print(e) 14 # 未捕捉到异常 15 else: 16 print("No error Found") 17 # 不管有没有捕捉到异常都会执行 18 finally: 19 print("finally") 20 21 22 >>> 23 >>>a 24 b 25 No error Found 26 finally 27 28 >>> 29 >>>c 30 'c' 31 finally
异常处理流程图:

常用异常
1 AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
2 IOError 输入/输出异常;基本上是无法打开文件
3 ImportError 无法引入模块或包;基本上是路径问题或名称错误
4 IndentationError 语法错误(的子类) ;代码没有正确对齐
5 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
6 KeyError 试图访问字典里不存在的键
7 KeyboardInterrupt Ctrl+C被按下
8 NameError 使用一个还未被赋予对象的变量
9 SyntaxError Python代码非法,代码不能编译
10 TypeError 传入对象类型与要求的不符合
11 UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
12 ValueError 传入一个调用者不期望的值,即使值的类型是正确的
自定义异常
1 # 定义一个异常类,继承Exception 2 class WError(Exception): 3 def __init__(self,message): 4 self.message = message 5 # 定义返回值 6 def __str__(self): 7 return self.message 8 9 try: 10 # 触发自定义异常(自定义异常只能自己触发,无法自动捕捉) 11 raise WError("W Error") 12 except WError as e: 13 print(e) 14 15 >>> 16 W Error

浙公网安备 33010602011771号