1、反射
反射的存在解决了eval的安全问题,eval是接收外界输入进行执行,而反射是对已有的东西进行转换或者操作相对安全
反射对象中的反射方法 hasattr getattr setattr delattr
getattr
class A: price = 0.3 def fun(self): print(‘1111‘) def fun1(self,age): print(‘111{}‘.format(age)) @classmethod def change_price(cls): cls.price = 0.7 a = A() a.name = ‘ebola‘ print(getattr(a,‘name‘)) #对象调用属性 getattr(A,‘fun1‘)(a,‘22‘) #类调用方法 getattr(a,‘fun1‘)(‘22‘) #对象调用方法 print(getattr(A,‘price‘)) #查看静态属性 getattr(A,‘change_price‘)() #执行改变的函数 是价格变成了0.7 print(getattr(a,‘price‘)) print(getattr(A,‘price‘)) 使用场景 变量名 = input(‘请输入查看的属性‘) print(getattr(a,变量名)) #返回的字符串直接执行就可以
# 夫妻档 if hasattr(A,‘fun1‘): #先判断有没有这个方法 getattr(A,‘fun1‘)() #执行这个方法 反射模块的方法 模块名.模块名中的函数名字字符串 import sys sys.path.append(r‘C:\Users\zzzzzz\Desktop\python\【Ebola】day - 副本 (27)\y.py‘) import y getattr(y,‘fun1‘)() a = y.A() #调用模块的类 a.fun() C1 = getattr(y,‘A‘)() #调用模块中的类 再加上括号相当于实例化 print(C1.price) 调用自身模块 name = ‘小明‘ print(getattr(sys.modules[__name__],‘name‘)) #调用自身模块中的变量 a = getattr(sys.modules[__name__],‘A‘)() #调用自身模块中的类 print(getattr(a,‘price‘))
setattr 设置修改变量(添加) deltattr 删除一个变量
class A: pass a = A() setattr(A,‘name‘,‘gaojiantao‘) #添加一个静态变量 setattr(a,‘name‘,‘luliu‘) #添加一个动态变量 print(a.name) delattr(a,‘name‘) #删除对象a 中的name print(a.name) #name被删除去找 就去类中找 print(A.name)