• 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')
  • 相关阅读:
    java中的接口
    java中的多态
    java中的继承
    抽象和封装
    表单验证
    13、迭代器与生成器
    10、end关键字和Fibonacci series: 斐波纳契数列
    9、字典
    8、元组
    2、Python_Day_1_作业
  • 原文地址:https://www.cnblogs.com/waited/p/5325560.html
Copyright © 2020-2023  润新知