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.7a = 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.7print(getattr(a,'price'))print(getattr(A,'price'))使用场景变量名 = input('请输入查看的属性')print(getattr(a,变量名)) #返回的字符串直接执行就可以
# 夫妻档if hasattr(A,'fun1'): #先判断有没有这个方法 getattr(A,'fun1')() #执行这个方法反射模块的方法 模块名.模块名中的函数名字字符串import syssys.path.append(r'C:\Users\zzzzzz\Desktop\python\【Ebola】day - 副本 (27)\y.py')import ygetattr(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: passa = A()setattr(A,'name','gaojiantao') #添加一个静态变量setattr(a,'name','luliu') #添加一个动态变量print(a.name)delattr(a,'name') #删除对象a 中的nameprint(a.name) #name被删除去找 就去类中找print(A.name)