zoukankan      html  css  js  c++  java
  • Python-Basis-16th

    周六,晴,记录生活分享点滴

    参考博客:https://www.cnblogs.com/wupeiqi/articles/5017742.html

    Python版本:3.5

    异常处理

    异常基础

    在程序出现bug时一般不会将错误信息显示给用户,而是显示在一个提示的页面

    while True:
        try:
            inp = input('请输入序号:')  # 1.1代码块:自定义代码逻辑
            i = int(inp)
       
    # 1.2上述代码块如果出错,自动执行当前块的内容
        except Exception as e:  # 2. e是Exception对象,对象中封装了错误信息
            print(e)  
            i = 1
        print(i)

    异常种类及其他结构

    部分错误类型及执行顺序

    def fun():
        ret = 0
        try:
            li = [11, 22]
            li[1]  # 3. 如果在执行中出现错误,下面的条件不会再执行,如果想执行下面的条件,需要把当前的错误修正
            int('w3r')
            
    # 2.1 如果出错,执行except
        except IndexError as e:  # 1. 逐步筛选错误类型,exception范围最大
            print('IndexError',e)  
        except ValueError as e:
            print('ValueError',e)
        except Exception as e:
            print('Exception',e)
    
    # 2.2 如果没有出错,执行else    
        else:
            ret = 1
            print('elese')
    
    # 2.3 最后无论是否出错,肯定执行
            finally:
            print('....')

    主动触发异常

    try:
       
        raise Exception('不过了...')  # 主动触发异常
        
    except Exception as e:    
        print(e)

    主动触发异常应用:通过文件状态判断将此时的文件情况记录到日志中

    def db():
        return False  # 或者设定为 return True
    
    def index():
        try:
            r = input(">>")
            int(r)  # 1. 如果1出错,执行exception,3记录日志
    
            result = db()
            if not result:  # 2. 如果1正确,2出错,执行exception,3记录日志
                raise Exception('数据库处理错误')  # 可以主动触发异常,不需要重复写3记录日志操作
                
        except Exception as e:
            str_error = str(e)
            print(str_error)
            r = open('log', 'a')  # 3. 打开文件,写日志
            r.write(str_error)
            
    
    index()

    自定义异常

    class HelloError(Exception):
    
        def __init__(self, msg):
            self.message = msg
    
        def __str__(self):
            return self.message
    
    
    try:
        raise HelloError('我错了...')  # 自定义异常HelloError
    except HelloError as e:
        print(e)  # 执行e对象的__str__()方法,获取__str__()返回值:“我错了...”

    断言

    assert 条件叫断言,用于强制用户服从,不服从就报错,可捕获,一般不捕获

    print(23)
    assert 1==2  # 条件成立,不执行assert;条件不成立,执行assert,报错AssertionError
    print(456)

    反射

    hasattr、getattr、setattr、delattr

    这四个函数分别用于对象中的内部执行:检查是否含有某成员、获取成员、设置成员、删除成员

    class Foo(object):
     
        def __init__(self):
            self.name = 'chung'
     
        def func(self):
            return 'func'
     
    obj = Foo()
     
    # #### 检查是否含有成员 ####
    hasattr(obj, 'name')
    hasattr(obj, 'func')
     
    # #### 获取成员 ####
    getattr(obj, 'name')
    getattr(obj, 'func')
     
    # #### 设置成员 ####
    setattr(obj, 'age', 18)
    setattr(obj, 'show', lambda num: num + 1)
     
    # #### 删除成员 ####
    delattr(obj, 'name')
    delattr(obj, 'func')

    详细解析

    class Foo(object):
     
        def __init__(self):
            self.name = 'chung'  
     
        def func(self):
            return 'func'
     
    obj = Foo()
     
    # 访问字段
    obj.name  # name和func是变量名
    # 执行方法
    obj.func()  # obj.xxx表示在obj中或类中寻找变量名xxx,并获取对应内存地址中的内容

    获取obj对象中的name变量指向内存中的值 “chung”

    方式一

    class Foo(object):
    
        def __init__(self):
            self.name = 'alex'
    
        def func(self):
            return 'func'
    
    # 不允许使用 obj.name
    obj = Foo()
    
    print obj.__dict__['name']

    方式二

    class Foo(object):
    
        def __init__(self):
            self.name = 'alex'
    
        def func(self):
            return 'func'
    
    # 不允许使用 obj.name
    obj = Foo()
    
    print getattr(obj, 'name'

    小结

    反射是通过字符串的形式操作对象相关的成员。一切事物都是对象。

    类是对象

    class Foo(object):
     
        staticField = "old boy"
     
        def __init__(self):
            self.name = 'wupeiqi'
     
        def func(self):
            return 'func'
     
        @staticmethod
        def bar():
            return 'bar'
     
    print getattr(Foo, 'staticField')
    print getattr(Foo, 'func')
    print getattr(Foo, 'bar')

    模块是对象

    # home.py文件中
    def dev(): return 'dev'
    # --------这是一条分割线-----------
    """ 程序目录: home.py index.py 当前文件: index.py """ import home as obj #obj.dev() func = getattr(obj, 'dev') func()

    单例模式

     单例模式用来保证内存中仅存在一个实例

    # ########### 单例类定义 ###########
    class Foo(object):
     
        __instance = None
     
        @staticmethod
        def singleton():
            if Foo.__instance:
                return Foo.__instance
            else:
                Foo.__instance = Foo()
                return Foo.__instance
     
    # ########### 获取实例 ###########
    obj = Foo.singleton()

    小结:

    单例模式中创建对象时不能再直接使用:obj = Foo(),而应该调用特殊的方法:obj = Foo.singleton() 

    保证当前内存中仅存在单个实例,避免内存浪费

     

  • 相关阅读:
    bzoj1093【ZJOI2007】最大半联通子图
    bzoj3609【HEOI2014】人人尽说江南好
    Codeforces Round #381 Div.2
    bzoj3405:[Usaco2009 Open]Grazing2 移动牛棚
    bzoj3389:[Usaco2004 Dec]Cleaning Shifts安排值班
    bzoj3315:[Usaco2013 Nov]Pogo-Cow
    bzoj1018:[SHOI2008]堵塞的交通traffic
    bzoj4637:期望
    二次剩余
    Very Long Suffix Array
  • 原文地址:https://www.cnblogs.com/chungzhao/p/13053040.html
Copyright © 2011-2022 走看看