#反射: 程序可以访问、检查和修改它本身的状态的行为的一种能力
#python中在面向对象中的反射:通过字符串的形式操作对象相关属性,通过字符串让对象自检是否有字符串表示的属性。
#python当中 反射提供的方法:hasattr/getattr/setattr/delattr
1、hasattr:根据字符串的形式去某个模块判断是否存在某对象
hasattr(obj, 'string') 让obj自省自检有没有和string名符合的属性,有返回True,没有返回False。
2、getattr:根据字符串的形式去某个模块当中寻找某对象
getattr(obj, 'string', None) 返回obj和string名相同的绑定方法。可以用来让一个变量引用这个返回结果,后面就可以call这个变量
,相当于call对象的绑定方法.如果没有,返回None,没有第三个参数则抛出异常
3、setattr:根据字符串的形式去某个模块当中设置某对象
setattr(obj, 'string', val) obj设置一个和string同名的的属性,并赋值为val。
4、delattr:根据字符串的形式去某个模块当中删除某对象
delattr(obj, 'string') 删除obj对象的‘string’的同名的属性。
哪些对象可以使用反射:
python中一切都是对象,都可以使用反射来进行自检
1、类可以对类的共有属性,方法(绑定方法,非绑定方法)进行反射
2、模块也可以进行反射。如:判定导入的模块是否有某个方法,有就调用。
--->实际上,反射在java当中是很强大的东西,但是在python当中也可以使用,比如在一些关键字驱动的框架里面,就会有反射相关的应用
例:=====================
class People(object): def __init__(self, name, age): self.name = name self.age = age def speak(self): print('%s is speaking' % self.name)
obj = People('qika', 18) f = input('qika:').strip() #strip()清除格式 if hasattr(obj, f): #hasattr 判断是否存在obj,f两个变量 getattr(obj, f)() func1 = getattr(obj, f) func1() else: print('名字:{} 说:{}'.format(obj.name, f))
例:================================
#对象应用反射 class Foo: def __init__(self): self.name = 'qika' self.age = 18 def func(self): print('hello') f = Foo() setattr(f,'sex','男') #设置一个属性("sex","男") print(f.sex) #打印一下里面的这个属性。其中的f是自己定义的变量,用来接收Foo()类实例化;然后直接调用属性:f.sex delattr(f,"sex") #同上,这里进行“删除一个属性” hasattr(f,'name') #同上,判断name属性是否存在 if hasattr(f,'func'): #连着一起使用:判断是否存在 getattr(f,'func')() #查找f(即Foo类实例化的接收的变量名)内这个func这个属性方法 else: print('没找到')
例:=================================
#类中的反射 class Foo: f = 123 @classmethod def class_method_dome(cls): print('class_method_dome') @staticmethod def static_method_dome(): print('static_method_dome') print(hasattr(Foo,'class_method_dome')) method = getattr(Foo,'class_method_dome') method() print('------------') print(hasattr(Foo,'static_method_dome')) method1 = getattr(Foo,'static_method_dome') method1()