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

 

posted @ 2017-07-02 23:57  不知所以  阅读(70)  评论(0)    收藏  举报