python反射hasattr getattr setattr delattr
反射 : 是用字符串类型的名字 去操作 变量
相比于用eval('print(name)') 留有 安全隐患
反射 就没有安全问题
hasattr 语法:
hasattr(object, name)
object可以是对象,类,模块,当前Py文件.
name是一个给字符串数据类型,可以是变量(属性),函数(方法)。
如果name在object中存在,则返回Ture,否则返回False。
getattr与hasattr语法相同,返回的结果是对应name的值或函数。
反射对象的方法 a.func() ret = getattr(a,'func') ret() class A: price = 20 @classmethod def func(cls): print('in func') 反射类的属性 A.price print(getattr(A,'price')) 反射类的方法 :classmethod staticmethod A.func() if hasattr(A,'func'): getattr(A,'func')() 模块 import my 反射模块的属性 print(my.day) print(getattr(my,'day')) 反射模块的方法 getattr(my,'wahaha')() 内置模块也能用 time asctime import time print(getattr(time,'time')()) print(getattr(time,'asctime')()) def qqxing(): print('qqxing') year = 2018 import sys print(sys.modules['__main__'].year) 反射自己模块中的变量 print(getattr(sys.modules['__main__'],'year')) 反射自己模块中的函数 getattr(sys.modules['__main__'],'qqxing')() 变量名 = input('>>>') print(getattr(sys.modules[__name__],变量名)) 要反射的函数有参数怎么办? print(time.strftime('%Y-%m-%d %H:%M:S')) print(getattr(time,'strftime')('%Y-%m-%d %H:%M:S')) 一个模块中的类能不能反射得到 import my print(getattr(my,'C')()) if hasattr(my,'name'): getattr(my,'name')
注意:反射本py文件的name时
用sys.modules[__name__]取代sys.modules['__main__'],因为当别的文件把此py文件作为模块导入后__main__变为新的文件了,使用__name__变量则保证不会出现语法错误。
setattr() 语法:
setattr(object, name, value)
设置属性值
delattr 语法:
delattr(object, name)
删除一个属性。