反射的定义:
用字符串数据类型的变量名来访问这个变量的值
python面向对象中的反射,通过字符串的形式操作对象相关的属性.
python中一切都是对象(都可以使用反射)
反射的方法:
getattr 获取属性
hasattr 检测是否函数某属性
setattr 设置属性
delattr 删除属性
class Foo: f = "类的静态变量" def __init__(self,name,age): # 初始方法 self.name = name self.age =age def say_hi(self): # 函数,方法 print("hi,%s" %self.name) obj = Foo("zhao",18) #检测是否由某属性 print(hasattr(obj,"name")) #检测obj这个对象里面有没有name这个属性 print(hasattr(obj,"say_hi")) #检测obj这个对象里面有没有say_hi这个方法 # 获取属性 n = getattr(obj,"name") print(n) func = getattr(obj,'say_hi') func() # print(getattr(obj,"aaa")) # 不存在这个属性或者方法的话,直接报错 #设置属性 setattr(obj,'sb',True) setattr(obj,"show_name",lambda self:self.name + "帅哥") print(obj.__dict__) print(obj.show_name(obj)) #删除属性 delattr(obj,"age") delattr(obj,"show_name") print(obj.__dict__)
类也是对象:
class Foo: staticField = 'old boy' def __init__(self): self.name = "zhaoyang" def func(self): return "func" @staticmethod def bar(): return 'bar' print(getattr(Foo,'staticField')) print(getattr(Foo,'func')) print(getattr(Foo,'bar'))
反射当前模块成员
import sys def s1(): print 's1' def s2(): print 's2' this_module = sys.modules[__name__] hasattr(this_module, 's1') getattr(this_module, 's2')
导入其他模块,利用反射查找该模块是否存在某个方法
def test(): print('from the test')
""" 程序目录: module_test.py index.py 当前文件: index.py """ import module_test as obj #obj.test() print(hasattr(obj,'test')) getattr(obj,'test')()