pythond对象异常反射的学习笔记
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pythond对象异常反射的学习笔记相关的知识,希望对你有一定的参考价值。
python多继承,刚开始我是表示惊讶的,毕竟学的php,哪来的多继承?顶多也就是利用接口模拟多继承后者使用反射机制实现。那么还是来看看python的强大吧
1 首先,Python的类继承了多个类,那么其寻找方法的方式有两种,分别是:深度优先(经典类)和广度优先(新式类)
class 经典类{}
#唯一的区别就是要继承object,其之类都是新式类 class 新式类(object)
#方法寻找
class D(object): def bar(self): print ‘D.bar‘ class C(D): def bar(self): print ‘C.bar‘ class B(D): def bar(self): print ‘B.bar‘ class A(B, C): #按顺序继承,寻找也是按此顺序进行 #调用父类构造器最好用supper() def bar(self): print ‘A.bar‘ a = A() # 执行bar方法时 # 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错 # 所以,查找顺序:A --> B --> C --> D # 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了 a.bar()
# 如果是经典类:首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去D类中找,如果D类中么有,则继续去C类中找,如果还是未找到,则报错
# 所以,查找顺序:A --> B --> D --> C
# 建议使用新式类
2 共有与私有成员(很多的特殊成员此处不列出)
class A: name = "公有静态字段" __private = "私有静态字段" def __init__(self): self.name = ‘公有字段‘ self.__foo = "私有字段" #加上 ‘__‘ 就是私有的,外部访问会出错
3 检测对象
#检查是否obj是否是类 cls 的对象 class Foo(object): pass obj = Foo() isinstance(obj, Foo) #检查sub类是否是 super 类的派生类 class Foo(object): pass class Bar(Foo): pass issubclass(Bar, Foo)
4 异常处理
常用的异常
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的
#结构 try: # 主代码块 pass except KeyError,e: # 异常时,执行该块 pass else: # 主代码块执行完,执行该块 pass finally: # 无论异常与否,最终执行该块 pass
5 主动触发异常
raise
Exception(
‘错误了。。。‘
)
6 自定义异常处理
class WupeiqiException(Exception): def __init__(self, msg): self.message = msg def __str__(self): return self.message try: raise WupeiqiException(‘出错‘) except WupeiqiException,e: print e
7 反射
# #### 检查obj是否含有成员 #### hasattr(obj, ‘name‘) hasattr(obj, ‘func‘) # #### 获取obj成员 #### getattr(obj, ‘name‘) getattr(obj, ‘func‘) # #### 设置obj成员 #### setattr(obj, ‘age‘, 18) setattr(obj, ‘show‘, lambda num: num + 1) # #### 删除obj成员 #### delattr(obj, ‘name‘) delattr(obj, ‘func‘)
以上是关于pythond对象异常反射的学习笔记的主要内容,如果未能解决你的问题,请参考以下文章