Python 29 异常处理, 元类
所学内容
异常处理(常用)
AttributeError ·························· 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError ······································· 输入/输出异常;基本上是无法打开文件
ImportErro ································· 无法引入模块或包;基本上是路径问题或名称错误
IndentationError ···················· 语法错 误(的子类) ;代码没有正确对齐
IndexError ································ 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError ····································· 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C ···· 被按下
NameError ································· 使用一个还未被赋予对象的变量
SyntaxError Python ················· 代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError ···································· 传入对象类型与要求的不符合
UnboundLocalError ················· 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
ValueError ··································· 传入一个调用者不期望的值,即使值的类型是正确的
元类
1 什么是元类:
源自一句话:在python中,一切皆对象,而对象都是由类实例化得到的
2 关系:
1. 调用元类---->自定义的类
2. 调用自定义的类---->自定义的对象
class关键字创建自定义类的底层的工作原理,分为四步
1. 先拿到类名
2. 再拿到类的基类们
3. 然后拿到类的名称空间(执行类体代码,将产生的名字放到类的名称空间也就是一个字典里,补充exec)
4. 调用元类实例
自定义类的三个关键组成部分:
1. 类名
2. 类的基类们
3. 类的名称空间
异常处理
1、 什么是异常处理
异常是错误发生的信号,一旦程序出错就会产生一个异常, 如果该异常没有被应用程序处理,那么该异常就会抛出来,程序也随之终止
异常包含三个部分:traceback 异常的追踪信息,异常的类型,异常的信息
错误分为两大类:
语法的错误:在程序运行前就应该立即修正
逻辑的错误:
2、为何要异常处理
避免程序因为异常崩溃,所以在应用程序中应该对异常进行处理,从而增强程序的健壮性
3、如何异常处理
1 # 异常处理的单分支 2 try: 3 print('=====1') 4 print('=====2') 5 print('=====3') 6 d = {'x': 1, 'y': 2} 7 d['z'] # KeyError 8 print('=====4') 9 l = [1, 2, 3] 10 l[1000] # IndexError 11 print('=====5') 12 except IndexError: 13 print('IndexError') 14 15 print('other code') 16 17 异常处理的多分支 18 try: 19 print('=====1') 20 print('=====2') 21 print('=====3') 22 d = {'x': 1, 'y': 2} 23 d['z'] # KeyError 24 print('=====4') 25 l = [1, 2, 3] 26 l[1000] # IndexError 27 print('=====5') 28 except KeyError as e: 29 print('KeyError',e) 30 except IndexError as e: 31 print('IndexError',e) 32 33 34 print('other code')
元类
对象tea1是调用OldboyTeacher类得到的,如果说一切皆对象,那么OldboyTeacher也是一个对象,只要是对象
都是调用一个类实例化得到的,即OldboyTeacher=元类(...),内置的元类是type
1 class OldboyStudent: 2 def __init__(self,name,age,sex): 3 self.name=name 4 self.age=age 5 self.sex=sex 6 7 def score(self): 8 print('%s is scoring' %self.name) 9 10 tea1=OldboyTeacher('nuanxin',21,'male') 11 # print(type(tea1)) 12 print(type(OldboyTeacher))
自定义类的三个关键组成部分:
1 # 不依赖class关键字创建一个自定义类 2 # 1. 拿到类名 3 class_name='OldboyStydent' 4 #2. 拿到类的基类们:(object,) 5 class_bases=(object,) 6 #3. 拿到类的名称空间 7 class_dic={} 8 class_body=""" 9 school = 'Oldboy' 10 11 def __init__(self,name,age,sex): 12 self.name=name 13 self.age=age 14 self.sex=sex 15 16 def score(self): 17 print('%s is scoring' %self.name) 18 """ 19 exec(class_body,{},class_dic) 20 print(class_dic) 21 #4. 调用type得到自定义的类 22 OldboyTeacher=type(class_name,class_bases,class_dic) 23 24 print(OldboyTeacher) 25 # print(OldboyTeacher.school) 26 # print(OldboyTeacher.score) 27 28 tea1=OldboyTeacher('nuanixn',20,'male') 29 print(tea1.__dict__)