反射 , 异常处理
一、反射
镜面反射
首先我们访问变量是不能加上双引号,否则会当做字符串处理,但是我偏要字符串进行访问对应的变量
我们可以通过字符串间接使用对象名或者类名,方法名
举一个例子:
老头在银行存一笔私房钱100w
这个存款老头自己知道,相对于我们可以直接去银行取钱,就是我们可以直接用方法名去使用
如果老头的老伴想取出老头私房钱,代取(老头是不知道的情况)-》那老头身份证+银行卡+密码,这里银行卡就是老头镜像
就这个过程就是反射
1.1getattr 对象反射
1. getattr 获取指定的对象属性以及方法
格式:
变量名 = getattr(对象名, "对象方法名/对象属性名", 默认值)
class People :
def __init__ ( self, name, hair) :
self. name = name
self. hair = hair
def peopleInfo ( self) :
print ( f"这位同学名字为 { self. name} , 头发为 { self. hair} " )
stu1 = People( "张朝钧" , "白色+地中海" )
stu2 = People( "千若" , "绿色+地中海" )
n = getattr ( stu1, "hair" , True )
print ( n)
n = getattr ( stu1, "age" , False )
print ( n)
1.2 setattr
1. setattr 设置对象属性
格式:
settattr(对象名,"对象属性", 数值)
设置对象属性值
class People :
def __init__ ( self, name, hair) :
self. name = name
self. hair = hair
def peopleInfo ( self) :
print ( f"这位同学名字为 { self. name} , 头发为 { self. hair} " )
stu1 = People( "帅得遭不住" , "黑长直" )
print ( stu1. __dict__)
setattr ( stu1, "hair" , "白短卷" )
print ( stu1. __dict__)
setattr ( stu1, "age" , 18 )
print ( stu1. __dict__)
1.3 hasattr
hasattr 判断对象是否有对应的属性或者方法
就是看这个对象有没有该属性或者方法
格式:
hasattr(对象, "对象属性")
class People :
def __init__ ( self, name, hair) :
self. name = name
self. hair = hair
def peopleInfo ( self) :
print ( f"这位同学名字为 { self. name} , 头发为 { self. hair} " )
stu1 = People( "帅得遭不住" , "黑长直" )
print ( stu1. __dict__)
print ( hasattr ( stu1, "age" ) )
1.4 delattr
delattr 删除对象属性
delattr(对象, "对象属性")
class People :
def __init__ ( self, name, hair) :
self. name = name
self. hair = hair
def peopleInfo ( self) :
print ( f"这位同学名字为 { self. name} , 头发为 { self. hair} " )
stu1 = People( "帅得遭不住" , "黑长直" )
print ( stu1. __dict__)
delattr ( stu1, "name" )
print ( stu1. __dict__)
delattr ( stu1, "age" )
1.5 反射的使用
class Shop :
def register ( self) :
print ( "注册功能" )
def login ( self) :
print ( "登录功能" )
def shopping ( self) :
print ( "购物功能" )
shop1 = Shop( )
select = input ( "请输入你要操作的功能" )
if hasattr ( shop1, select) :
getattr ( shop1, select) ( )
else :
print ( "输入有误" )
二、异常
1.1 异常的定义
什么是异常:报错
也可以理解为突然终止程序或者程序效果无法满足需求的时候(异常)
捕捉异常:因为我们在程序编辑中,都会有些我们无法确定,或者确定有问题的代码可以进行预处理,是避免后面程序因为某个代码而正常运行
1.2 异常错误
1.语法错误:捕捉不了,因为这个语法错误是可以完全避免的 --sytaxError
2.逻辑错误
NameError 没有定义标识符
TypeError 类型错误, 不同类型进行数学计算
IndexError 下标值超出范围
......
1.3 异常处理(捕捉异常)
格式语法:
try:
代码块(怀疑有问题的代码块,或者经常出bug的代码块)
expect 异常类型:
代码块(编写输出指定的代码或者打印异常类型出错的文本信息)
else:
代码块(else和if---else的作用一样)
就是如果try没有捕捉到任何异常就运行这个代码块
finally:
不管有没有捕捉到异常,都会执行这个代码(关闭线程,关闭链接)
拓展:
Exception 可以捕捉任意异常
a = "梓良老师又高又帅"
try :
print ( a[ 1 ] )
except IndexError Exception as massg:
print ( "没有这么长的序列" )
print ( massg)
else :
print ( "是的,就是这么长的序列" )
finally :
print ( "不管上面有没有报错, 有一说一梓良老师真的帅" )
1.4 assert断言
assert 断言 :判断性的语言 下结论
就是测试, 下判断
在表达式不成立的时候,程序不会继续运行
在没有开发完一个程序之前,我们不知道程序在哪里出现错误,与其它运行时崩溃爆炸,不如直接自爆崩溃
客服兜底
格式:assert 判断表达式, 返回异常结果
判断表达式:所有返回值为bool都是可以认为判断表达式
当不符合需求,后面的代码是没有任何意义
a = 100
b = 200
assert a > b, "你数学是体育老师教的吗"
print ( "是的,我老师是告诉我100大于200的" )
a = "梓良老师又高又帅"
assert "帅" in a, "符合客观事实"
assert "丑b" in a, "不符合客观事实"
1.5 定义异常
raise 自定义异常, 自己可以定义异常信息
格式:
raise Exception(返回异常信息)
money = int ( input ( "请支付1000元" ) )
if money < 1000 :
raise Exception( f"一共1000元,你只是支付了 { money} " )
elif money > 1000 :
print ( f"返回金额为 { money - 1000 } " )
else :
print ( "交易成功" )