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

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

 

posted @ 2020-06-06 20:08  ChungZhao  阅读(105)  评论(0编辑  收藏  举报