python中的异常和反射

104 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第15天,点击查看活动详情

大家好,我是木大木大,因为疫情和环境原因啊,在家开始了自学python的路子,从此深坑加一人。后面我会每天持续更新一些学习python的过程,当然一开始就是一些基础啦,希望大家多多支持,莫嫌弃啦~

一、反射

反射:通过字符串的形式进行操作对象的属性方法

1、对象反射

1、getattr 获取指定的对象属性以及方法

变量名 = getattr(对象 , '对象属性' ,设置默认值) 
# 默认值:当在对象中查找不到对应的属性是返回的内容 , 如果没有设置的话 , 将会返回没有该属性的报错

2、setattr 设置对象属性

setattr(对象 , '对象属性' , 值)

3、hasattr 判断对象是否有对应的属性以及方法

变量名 = hasattr(对象 , '对象属性')
# 该方法返回的是bool类型

4、delattr 删除对象的属性

delattr(对象 , '对象属性')

代码:

class Foo:

    def __init__(self , name , age):
        self.name = name
        self.age = age

    def say_hi(self):
        print(f'hi 靓仔/靓女:{self.name}')

# getattr 获取指定的对象属性
# 变量名 = getattr(对象 , '对象属性' ,设置默认值)
ac = Foo('阿宸' , 24)

n = getattr(ac , 'name')
print(n)
h = getattr(ac , 'say_hi')
h()
f = getattr(ac , 'height' , '没有你要看的')
print(f)

# 2、setattr 设置对象属性
# setattr(对象 , '对象属性' , 值)
print(ac.age)
setattr(ac , 'age' , 25)
print(ac.age)

# 3、hasattr 判断对象是否有对应的属性以及方法
# d = hasattr(对象 , '对象属性')
d = hasattr(ac , 'name')
print(d)
a = hasattr(ac , 'height')
print(a)

# 4、delattr 删除对象的属性
delattr(ac , 'age')
# print(ac.age)

2、反射的使用

class User:
    def login(self):
        print('这个是登录操作')

    def register(self):
        print('欢迎来注册')

    def speak(self):
        print('来唠嗑呀!')

ac = User()
# 没有使用对象反射的情况
choose = input('请输入你要操作的功能:')
if choose == 'login':
    ac.login()
elif choose == 'register':
    ac.register()
elif choose == 'speak':
    ac.speak()
else:
    print('输入有误')

使用反射

class User:
    def login(self):
        print('这个是登录操作')

    def register(self):
        print('欢迎来注册')

    def speak(self):
        print('来唠嗑呀!')

ac = User()

# 使用反射
choose = input('请输入你要操作的功能:')
if hasattr(ac , choose):
    fun = getattr(ac , choose)
    fun()
else:
    print('输入有误')

二、异常

异常:就是在程序执行过程中有逻辑等的其他错位导致,使得程序终止运行

异常处理:在程序执行的过程中, 发现错误对其进行处理,让程序可以正常执行不为此错误而被迫停止运行

1、异常错误

1、语法错误:语法错误可以避免——SyntaxError

2、逻辑错误

# TypeError		类型错误,不同数据类型之间的无效操作
# NameError		变量名未定义
# IndexError    下标索引超出范围

2、异常处理

语法格式:

try:
    代码块(感觉有问题的代码)
except 异常类型:
    判断到上面的代码有异常之后执行的代码
else:
    代码没有异常执行的代码
finally:
    不管有没有异常都会执行的代码

在异常类型后面加上as 变量名 , 可以获取到这个异常的信息

Exception:可以捕获到所有的异常

try:
    res = '阿宸是个大帅哥 , 靓仔一个 , 棒棒的 , 超厉害的'
    print(res[30])
except IndexError as no:
    print('夸了 , 但没有夸那么多')
    print(no)

print('在座的各位也是厉害的')
try:
    res = '阿宸是个大帅哥 , 靓仔一个 , 棒棒的 , 超厉害的'
    print(res[50])
except Exception:
    print('夸了 , 但没有夸那么多')
else:
    print('夸得没毛病')
finally:
    print('管你谁 , 我就是要在夸一下 , 阿宸nice')
print('在座的各位也是厉害的')

3、assert断言

发送AssertionError异常错误

assert 判断表达式 , 返回异常信息(当判断表达式为False是执行)
# 表达是bool类型可以进行使用
x = 100
y = 200
ac = '阿宸是个大帅哥'
# assert x > y ,'你的数学谁交的 , 体育老师都不背锅'
assert '丑' in ac ,'说谁丑呢 , 找打 , 回去笔记抄个一百遍'
assert '帅' in ac ,'说谁丑呢 , 找打 , 回去笔记抄个一百遍'

4、定义异常

raise Exception(返回的异常信息)
money = int(input('请输入金额:'))
if money < 550:
    raise Exception(f'money不能小于550 , 当前money值为{money} , 交易失败 , 回去吧')
else:
    print('交易成功 , 合作愉快 , 期待下期合作哦')