工作记录 反射

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:UserszzzzzzDesktoppython【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)




原文地址:https://www.cnblogs.com/Ebola-/p/8329465.html