反射介绍
什么是反射
反射指的是程序可以访问、检查和修改它本身的状态的行为的一种能力(自省)。
在python中的反射是指:通过字符串的形式操作对象相关属性,就是通过字符串让对象自省自检是否有字符串表示的属性。
Python中反射机制的实现
1. 先通过dir()方法: 查看某一个对象下可以.出哪些属性
print(dir(obj))
2. 然后可以使用__dict__方法通过字符串反射到真正的属性上, 得到属性值
print(obj.__dict__['name'])
在Python中哪些对象可以使用反射机制
- python中一切都是对象,所以都可以使用反射来进行自省
- 类可以对类的共有属性,方法(绑定方法,非绑定方法)进行反射
- 当前模块也可以进行反射。如:判定导入的模块是否有某个方法,有的化就进行调用。
反射机制中的四大内置函数
hasattr()
hasattr(obj, 'string') 让obj自省自检有没有和string名符合的属性,有返回True,没有返回False。
print(hasattr(obj, 'name')) # True
getattr()
getattr(obj, 'string', None) 返回obj和string名相同的绑定方法。可以用来让一个变量引用这个返回结果,后面就可以使用这个变量, 相当于使用对象的绑定方法, 如果没有, 返回None, 没有第三个参数则抛出异常
print(getattr(obj, 'name')) # print(obj.__dict__['name'])
setattr()
setattr(obj, 'string', val) obj设置一个和string同名的的属性,并赋值为val。
setattr(obj, 'name', 'zhangjie') # obj.__dict__['name'] = 'zhangjie' print(obj.name)
delattr()
delattr(obj, 'string') 删除obj对象的‘string’的同名的属性。
delattr(obj, 'name') # del obj.__dict__['name'] print(obj.__dict__)
反射的案例
class Ftp(object): def get(self): print('正在执行下载功能') def interactive(self): method = input('>>>:').strip() # method = 'get' if hasattr(self, method): getattr(self, method)() else: print('输入的指令不存在') result = Ftp() result.interactive()