• Python反射、异常处理


    反射

    :字符串到对象属性的映射

    hasattr(obj,string),
    判断对象obj里面是否有叫string的字段或方法
    getattr(obj,string)
    获取obj对象里名叫string的字段或方法(如果重名先找字段)
    setattr(obj,y,v)
    设置属性或者方法obj.y = v
    delattr(obj,y)
    删除属性obj.y

    class Dog(object):
        def __init__(self,name):
            self.name = name
        def eat(self):
            print("%s is eating"%self.name)
    
    d = Dog("labuladuo")
    choice = input(">>").strip()
    #用户输入什么调用什么方法,用反射
    
    def bulk(self):
        print("%s is bulking"%self.name)
    
    if hasattr(d,choice):
        func = getattr(d,choice)
        func()
        #删除属性
        delattr(d,choice)
    else:
        #动态添加一个方法d.choice = bulk
        setattr(d,choice,bulk)
        d.bulk(d)
        #动态添加一个属性,如果该属性存在会报错
        setattr(d,choice,None)
        print(getattr(d,choice))

    反射为什么重要?
    动态的实现内存装配,通过字符串反射到内存对象,不用写一大堆if..else判断用户输入什么调用什么方法了,直接用反射

    异常处理

    Python中有很多异常,有的异常不能通过编译,例如:indentationError 这个不能catch

    低级版:抓住全部错误。不要这样用,自己搞着玩可以

    try:
        names[3]
        data["name"]
    except Exception as e:
        print("出错:",e)

    正常版:预料一些错误。一般的使用方式

    try:
        names[3]
        data["name"]
    except KeyError as e:
        print("没有该key",e)
    except IndexError as e:
        print(e)

    正常版低级形态:不知道是哪句代码出错,可以统一处理

    try:
        names[3]
        data["name"]
    except (KeyError,IndexError) as e:
        print("错误",e)

    终极出错大套餐:基本考虑各种情况,但是Exception不能catch缩进异常

    try:
        names[3]
        data["name"]
        open("aa.txt")
    except KeyError as e:
        print("没有该key",e)
    except IndexError as e:
        print("下标越界",e)
    except Exception as e:
        print("未知错误:",e)
    else:
        print("一切正常")
    finally:
        print("不管有没有错,都执行")

    自定义异常,例如别人调你的接口,别人触发你定义的异常

  • 相关阅读:
    用R语言完成的交通可视化报告
    二维码(带有图片)的生成
    大文件数据去重复
    shell 脚本大文件处理
    Domain-specific language 领域特定语言
    cacheed 限制 4节点 3000万 es 批量删除 shell脚本练习 elasticsearch_action
    cached
    广告中嵌入非广告 非广告中嵌入广告
    js 四种调用方式 Method Invocation Pattern
    js 变量作用域
  • 原文地址:https://www.cnblogs.com/revo/p/7400060.html
Copyright © 2020-2023  润新知