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')

 

posted @ 2016-03-27 14:18  waited  阅读(420)  评论(0编辑  收藏  举报