🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## 反射用途 反射可以通过字符串映射到对象的属性. ### 简单举例: 实例化了一个类,类中有多个属性,现在让用户输入,然后打印输入的属性, 但是对象不能直接使用字符串,会报'AttributeError 属性错误' ~~~ class cl: country='China' def __init__(self,name,age): self.name=name self.age=age obj=cl('noah',22) inp='name' #模拟用户输入 print(obj.name) #结果 noah print(obj.inp) #报错AttributeError: 'cl' object has no attribute 'inp' print(getattr(obj,inp,None)) #结果 noah #使用getattr方法做反射就不会报错 ~~~ 这种时候就需要用到反射的方法把字符串印射为对象的属性或方法 ## 反射四大将军 python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射) ### 用途简述 * hasattr(object,name) 判断object中有没有一个name字符串对应的方法或属性 * getattr(object, name, default=None) 获取object中name字符串对应的方法或属性,如果不存在则返回None,可以定义其他返回值 * setattr(object, name, values) 修改object中name属性为values值,name属性不存在,则新增改属性 * delattr(object,name) 删除object对象中的name属性 ### 简单案例 判断用户的输入对象的方法是否存在,存在则执行相关方法 ``` class service: def run(self): while True: chioce=input('>>: ').strip() if hasattr(self,chioce): fun=getattr(self,chioce) fun() def get(self): print('get.........') def put(self): print('put.........') obj=service() obj.run() #运行: >>: abc >>: get get......... ``` ### 反射的好处-实现可插拔 可以事先定义好接口,接口只有在被完成后才会真正执行,这实现了即插即用,这其实是一种‘后期绑定’,即你可以事先把主要的逻辑写好(只定义接口),然后后期再去实现接口的功能 有俩程序员lili和egon,lili的程序需要用到egon所写的类,但是egon没有完成他写的类,用了反射机制lili可以继续完成自己的代码,等egon后面再完成类的定义并且去实现lili想要的功能。 **egon还没有实现全部功能** ~~~ class FtpClient: 'ftp客户端,但是还么有实现具体的功能' def __init__(self,addr): print('正在连接服务器[%s]' %addr) self.addr=addr ~~~ **不影响lili的代码编写** ~~~ #from module import FtpClient f1=FtpClient('192.168.1.1') if hasattr(f1,'get'): func_get=getattr(f1,'get') func_get() else: print('---->不存在此方法') print('处理其他的逻辑') ~~~